{
  "founder": "abubakarsadiq",
  "channel": "#bitcoin-core-pr-reviews",
  "network": "libera",
  "id": "635749a0e5af496992358fa9a3c6c8ea",
  "name": "#bitcoin-core-pr-reviews",
  "chair": "abubakarsadiq",
  "chairs": [
    "abubakarsadiq"
  ],
  "nicks": {
    "abubakarsadiq": 55,
    "corebot": 6,
    "dzxzg": 12,
    "sebastianvstaa": 14,
    "monlovesmango": 22,
    "Guest16": 1,
    "enochazariah": 1,
    "stringintech": 17,
    "sjors47": 12,
    "Sjors[m]": 59,
    "santos": 3
  },
  "start_time": "2025-04-30T17:00:14.031404+00:00",
  "end_time": "2025-04-30T18:00:08.822472+00:00",
  "active": false,
  "original_topic": "https://bitcoincore.reviews | meetings on the first Wednesday of each month at 17:00 UTC",
  "current_topic": null,
  "messages": [
    {
      "id": "91e713c204434473a7a7f3738230e5c2",
      "sender": "abubakarsadiq",
      "payload": "#startmeeting",
      "action": false,
      "timestamp": "2025-04-30T17:00:14.030965+00:00"
    },
    {
      "id": "bef3e434a73c4464926f685576e8c1bc",
      "sender": "corebot",
      "payload": "abubakarsadiq: Meeting started at 2025-04-30T17:00+0000",
      "action": false,
      "timestamp": "2025-04-30T17:00:14.039025+00:00"
    },
    {
      "id": "a625050d6c0a4507b7297df3888f32a5",
      "sender": "corebot",
      "payload": "abubakarsadiq: Current chairs: abubakarsadiq",
      "action": false,
      "timestamp": "2025-04-30T17:00:15.042942+00:00"
    },
    {
      "id": "865b6e62754743049dbc24252ed695f4",
      "sender": "corebot",
      "payload": "abubakarsadiq: Useful commands: #action #info #idea #link #topic #motion #vote #close #endmeeting",
      "action": false,
      "timestamp": "2025-04-30T17:00:16.047009+00:00"
    },
    {
      "id": "3cd4d1e5699e47669c288544a6abfd82",
      "sender": "corebot",
      "payload": "abubakarsadiq: See also: https://hcoop-meetbot.readthedocs.io/en/stable/",
      "action": false,
      "timestamp": "2025-04-30T17:00:17.050996+00:00"
    },
    {
      "id": "4bcd502eeb6a46b3828a005980253e73",
      "sender": "corebot",
      "payload": "abubakarsadiq: Participants should now identify themselves with '#here' or with an alias like '#here FirstLast'",
      "action": false,
      "timestamp": "2025-04-30T17:00:18.054966+00:00"
    },
    {
      "id": "50eadd55298a45bfbc1e789699bbe769",
      "sender": "dzxzg",
      "payload": "Hi",
      "action": false,
      "timestamp": "2025-04-30T17:00:24.948493+00:00"
    },
    {
      "id": "a3bc1c67899e49c1b2277f40b552e920",
      "sender": "sebastianvstaa",
      "payload": "Hi",
      "action": false,
      "timestamp": "2025-04-30T17:00:33.085368+00:00"
    },
    {
      "id": "16236fb1eecd43afa6006475c178a1c1",
      "sender": "abubakarsadiq",
      "payload": "hi hi",
      "action": false,
      "timestamp": "2025-04-30T17:00:33.468507+00:00"
    },
    {
      "id": "2c73fc5ccffc4389be06edc6548bb43f",
      "sender": "monlovesmango",
      "payload": "hey",
      "action": false,
      "timestamp": "2025-04-30T17:00:43.690981+00:00"
    },
    {
      "id": "9370a2970d4d4a78b878f408527f7838",
      "sender": "Guest16",
      "payload": "hi",
      "action": false,
      "timestamp": "2025-04-30T17:00:59.533307+00:00"
    },
    {
      "id": "9e296b2086954f3ba1309e3db22dba17",
      "sender": "abubakarsadiq",
      "payload": "welcome to this week review club session \\o/",
      "action": false,
      "timestamp": "2025-04-30T17:01:22.893392+00:00"
    },
    {
      "id": "23ce02389d3c45aabdab96af9769c545",
      "sender": "abubakarsadiq",
      "payload": "We will take a loot at #31981",
      "action": false,
      "timestamp": "2025-04-30T17:01:41.413250+00:00"
    },
    {
      "id": "49a4da523d1a4513bad5fd3bb302d85d",
      "sender": "corebot",
      "payload": "https://github.com/bitcoin/bitcoin/issues/31981 | Add checkBlock() to Mining interface by Sjors \u00b7 Pull Request #31981 \u00b7 bitcoin/bitcoin \u00b7 GitHub",
      "action": false,
      "timestamp": "2025-04-30T17:01:43.465228+00:00"
    },
    {
      "id": "ad5f045e8022489282a8b09b3c2fdc5e",
      "sender": "abubakarsadiq",
      "payload": "The notes and question are available https://bitcoincore.reviews/31981",
      "action": false,
      "timestamp": "2025-04-30T17:02:09.129402+00:00"
    },
    {
      "id": "984dfe2f26984c0a9b611668ca4b89c7",
      "sender": "abubakarsadiq",
      "payload": "Did you review the PR or read the notes? Concept ACK, approach ACK, tested ACK, or NACK? What was your review approach?",
      "action": false,
      "timestamp": "2025-04-30T17:03:01.112139+00:00"
    },
    {
      "id": "6f6adf0a5adc41dda290b92975a2cf5b",
      "sender": "monlovesmango",
      "payload": "reviewed some of the PR, read the notes. concept ACK",
      "action": false,
      "timestamp": "2025-04-30T17:03:52.303233+00:00"
    },
    {
      "id": "3587ec424b184bfbbeb8287b90682eae",
      "sender": "enochazariah",
      "payload": "reviewed the PR partially, and read the notes as well. Conecpt ACK",
      "action": false,
      "timestamp": "2025-04-30T17:04:12.718663+00:00"
    },
    {
      "id": "9fe3a5abdfa14fc185eee20da0918dc8",
      "sender": "sebastianvstaa",
      "payload": "concept ACK, approach ACK. Worked through the questions",
      "action": false,
      "timestamp": "2025-04-30T17:04:21.531728+00:00"
    },
    {
      "id": "d977bd92510741cc9c4a05435a706cc7",
      "sender": "abubakarsadiq",
      "payload": "nice",
      "action": false,
      "timestamp": "2025-04-30T17:04:26.899320+00:00"
    },
    {
      "id": "428576c1b69444a6b26ac6ad243d9325",
      "sender": "dzxzg",
      "payload": "I reviewed the pr commits, and made some experimental changes concept ACK, with questions about the approach",
      "action": false,
      "timestamp": "2025-04-30T17:04:33.149321+00:00"
    },
    {
      "id": "5c826b6643b746c589a86da4118e811c",
      "sender": "abubakarsadiq",
      "payload": "Lets jump into the conceptual questions then.",
      "action": false,
      "timestamp": "2025-04-30T17:04:49.086652+00:00"
    },
    {
      "id": "1154a65492734e1d953df0907dff063e",
      "sender": "abubakarsadiq",
      "payload": "Does an Sv2 TP client have to implement the new checkBlock method in the mining interface (yes/no)?",
      "action": false,
      "timestamp": "2025-04-30T17:04:54.656931+00:00"
    },
    {
      "id": "24c87c0c3504435db7f49bf778d75b12",
      "sender": "sebastianvstaa",
      "payload": "no",
      "action": false,
      "timestamp": "2025-04-30T17:05:12.984968+00:00"
    },
    {
      "id": "77fe5835f31e42e189373d4da24d7457",
      "sender": "monlovesmango",
      "payload": "no",
      "action": false,
      "timestamp": "2025-04-30T17:05:25.055720+00:00"
    },
    {
      "id": "c31a21d815a749668aefe79924d284c3",
      "sender": "stringintech",
      "payload": "I'm a bit confused by the terminology here. The PR description mentions \u201cpools\u201d may want to verify templates using checkBlock IPC (or getblocktemplate proposal mode). The question asks if \u201cSv2 TP clients\u201d need to implement this method. Are \u201cpools\u201d and \u201cSv2 TP clients\u201d the same thing here? I haven't gone through the Sv2 documentation",
      "action": false,
      "timestamp": "2025-04-30T17:05:32.807383+00:00"
    },
    {
      "id": "7c7316f31fc14ff1baf5b8e9eb398e2b",
      "sender": "stringintech",
      "payload": "yet, so I might be missing something obvious.",
      "action": false,
      "timestamp": "2025-04-30T17:05:33.375644+00:00"
    },
    {
      "id": "496dc36a73ff4af0aa7f424fb93c0183",
      "sender": "monlovesmango",
      "payload": "its the Sv2 TP server that has to implement it right?",
      "action": false,
      "timestamp": "2025-04-30T17:05:37.279508+00:00"
    },
    {
      "id": "1d3445fa13d547c0b3084a3718a78c4b",
      "sender": "sebastianvstaa",
      "payload": "It can still utilize the method provided by Bitcoin Core via IPC",
      "action": false,
      "timestamp": "2025-04-30T17:06:09.548951+00:00"
    },
    {
      "id": "730487ea12134fa3a398c362c8049d48",
      "sender": "abubakarsadiq",
      "payload": "yes sebastianvstaa: monlovesmango",
      "action": false,
      "timestamp": "2025-04-30T17:06:19.907893+00:00"
    },
    {
      "id": "b9656133b91945d0abba81197b2c4f8b",
      "sender": "abubakarsadiq",
      "payload": "TP does not need the checkBlock  method, I think it's the Sv2 server",
      "action": false,
      "timestamp": "2025-04-30T17:06:59.682120+00:00"
    },
    {
      "id": "5bf5abaa1d154798ba1ff434e45081b6",
      "sender": "abubakarsadiq",
      "payload": "Question 2: Can you list some checks performed on the block in getblocktemplate proposal mode? Does that include checking for a valid proof of work for the block template?",
      "action": false,
      "timestamp": "2025-04-30T17:07:53.529600+00:00"
    },
    {
      "id": "d79b1963c927467fbd85aa499b3fff66",
      "sender": "monlovesmango",
      "payload": "it seems to check for duplicate and duplicate-invalid blocks",
      "action": false,
      "timestamp": "2025-04-30T17:08:33.633028+00:00"
    },
    {
      "id": "ec8e2d8627dc445f9825482092525c69",
      "sender": "sebastianvstaa",
      "payload": "block size limit, duplicate transactions",
      "action": false,
      "timestamp": "2025-04-30T17:08:38.479606+00:00"
    },
    {
      "id": "725dd0069fe146fbae106ef8fd68482a",
      "sender": "monlovesmango",
      "payload": "POW is not checked",
      "action": false,
      "timestamp": "2025-04-30T17:08:44.982478+00:00"
    },
    {
      "id": "0a1ad5fa7c82492f9666f8ecb39503aa",
      "sender": "stringintech",
      "payload": "Context-free checks like merle root, duplicate txs, block size, \u2026",
      "action": false,
      "timestamp": "2025-04-30T17:08:58.499237+00:00"
    },
    {
      "id": "0dc5360ab14746f5b00109f3af7b3a8f",
      "sender": "stringintech",
      "payload": "Contextual checks like block time, tx finality, whether block witness data has been tempered with, block weight, \u2026",
      "action": false,
      "timestamp": "2025-04-30T17:08:59.000406+00:00"
    },
    {
      "id": "0099b09371c241668529ef964b965f6b",
      "sender": "stringintech",
      "payload": "And no valid PoW is checked cause the goal would be start solving the block once the checkBlock passes in getblocktemplate proposal mode.",
      "action": false,
      "timestamp": "2025-04-30T17:08:59.501123+00:00"
    },
    {
      "id": "cfcf6cead4d948ba944090035af9417b",
      "sender": "sebastianvstaa",
      "payload": "yes, no PoW",
      "action": false,
      "timestamp": "2025-04-30T17:09:11.260726+00:00"
    },
    {
      "id": "020ff3efa2e144c092706538cf294f9e",
      "sender": "sebastianvstaa",
      "payload": "The idea is to check validity before you spend resources on mining",
      "action": false,
      "timestamp": "2025-04-30T17:09:43.914663+00:00"
    },
    {
      "id": "d373ff3bfc494471af3bd1e24856b802",
      "sender": "monlovesmango",
      "payload": "stringintech: very thorough and helpful answer :)",
      "action": false,
      "timestamp": "2025-04-30T17:10:20.086421+00:00"
    },
    {
      "id": "d3c982cdb5ec4ad28274709c6befabd9",
      "sender": "abubakarsadiq",
      "payload": "@stringintech yeah",
      "action": false,
      "timestamp": "2025-04-30T17:10:28.533392+00:00"
    },
    {
      "id": "b9d91e03d3614cbf83954874d14bb648",
      "sender": "abubakarsadiq",
      "payload": "sebastianvstaa: I am not sure if that is correct cc @sjors",
      "action": false,
      "timestamp": "2025-04-30T17:11:29.456053+00:00"
    },
    {
      "id": "55231d311f554a5d8bd259f6195bd410",
      "sender": "sebastianvstaa",
      "payload": "abubakarsadiq what statement exactly?",
      "action": false,
      "timestamp": "2025-04-30T17:12:02.769517+00:00"
    },
    {
      "id": "319142d7223c4348bef8872765eb7c8e",
      "sender": "sebastianvstaa",
      "payload": "check validity before mining?",
      "action": false,
      "timestamp": "2025-04-30T17:12:19.427568+00:00"
    },
    {
      "id": "05ba360d9857429897d54285791a42a4",
      "sender": "abubakarsadiq",
      "payload": "your statement \"The idea is to check validity before you spend resources on mining\"",
      "action": false,
      "timestamp": "2025-04-30T17:12:26.953678+00:00"
    },
    {
      "id": "6d95274cff6f404fbf8b5adeabf91db2",
      "sender": "stringintech",
      "payload": "monlovesmango: \ud83d\ude4c\ud83c\udffb",
      "action": false,
      "timestamp": "2025-04-30T17:12:57.359564+00:00"
    },
    {
      "id": "eedd412ff35f494d8a6a33838c55282d",
      "sender": "sebastianvstaa",
      "payload": "what else would you do without PoW?",
      "action": false,
      "timestamp": "2025-04-30T17:13:05.233188+00:00"
    },
    {
      "id": "b38c867372dd47e0a24ce07d3d331d8c",
      "sender": "abubakarsadiq",
      "payload": "follow-up question why is POW not checked, but we check that the nBits are valid?",
      "action": false,
      "timestamp": "2025-04-30T17:13:19.765190+00:00"
    },
    {
      "id": "51e1c2d92c2d4db18f7d172d01de8d9f",
      "sender": "abubakarsadiq",
      "payload": "The next question is",
      "action": false,
      "timestamp": "2025-04-30T17:13:51.779053+00:00"
    },
    {
      "id": "4145736836aa4d5d9f8ad7480f2792f0",
      "sender": "abubakarsadiq",
      "payload": "4. Apart from performance reasons mentioned in the PR description, are there any reasons an Sv2 TP client would want to use IPC instead of RPC?",
      "action": false,
      "timestamp": "2025-04-30T17:13:51.900693+00:00"
    },
    {
      "id": "3a955528302c47c59733a4eeaa1d4da4",
      "sender": "stringintech",
      "payload": "Not sure but if clients are already using IPC for mining related functions implementing block verification this way too would be easier.",
      "action": false,
      "timestamp": "2025-04-30T17:15:05.464589+00:00"
    },
    {
      "id": "18d6fb73871247ebb6d622b9e312e6cb",
      "sender": "sebastianvstaa",
      "payload": "Better integration with the other components in the multiprocess project?",
      "action": false,
      "timestamp": "2025-04-30T17:15:25.119145+00:00"
    },
    {
      "id": "2079a4e2f265476da184943637795bb3",
      "sender": "monlovesmango",
      "payload": "is IPC multi threaded? RPC seems to be single threaded, but maybe i'm wrong on that",
      "action": false,
      "timestamp": "2025-04-30T17:15:33.254586+00:00"
    },
    {
      "id": "19edb0fa1a71444e8d922c6492dd0b25",
      "sender": "sjors47",
      "payload": "sorry for the delay",
      "action": false,
      "timestamp": "2025-04-30T17:15:49.435085+00:00"
    },
    {
      "id": "645f62596629439493d60e3f6285476b",
      "sender": "monlovesmango",
      "payload": "does IPC expose a port to listen?",
      "action": false,
      "timestamp": "2025-04-30T17:15:51.498807+00:00"
    },
    {
      "id": "b8dc34ccfed44becbf12d805c3d68b9b",
      "sender": "abubakarsadiq",
      "payload": "I think another reason apart from performance I read is that  RPC is poll-based. An Sv2 TP client prefers push-based communication or long-polling, as seen in the waitNext implementation.",
      "action": false,
      "timestamp": "2025-04-30T17:16:31.149342+00:00"
    },
    {
      "id": "24d543f6f53341739c9ae166088a9a7f",
      "sender": "sjors47",
      "payload": "monlovesmangonot at the moment",
      "action": false,
      "timestamp": "2025-04-30T17:16:35.194054+00:00"
    },
    {
      "id": "9d9412549efe4acfb8261c0d650022e3",
      "sender": "sjors47",
      "payload": "monlovesmango: not at the moment",
      "action": false,
      "timestamp": "2025-04-30T17:16:42.552188+00:00"
    },
    {
      "id": "1ffc4d06237044c598323185ff70c22e",
      "sender": "sjors47",
      "payload": "It listens on a Unix socket",
      "action": false,
      "timestamp": "2025-04-30T17:16:50.178101+00:00"
    },
    {
      "id": "4a76025db38a4d04b6111491cad31128",
      "sender": "sjors47",
      "payload": "Or maybe TPC port support as also been added.",
      "action": false,
      "timestamp": "2025-04-30T17:17:10.508801+00:00"
    },
    {
      "id": "d59df55e7102430c87a1261d4632ea37",
      "sender": "sjors47",
      "payload": "stringintech: a pool in stratum v2 is just a pool like now.",
      "action": false,
      "timestamp": "2025-04-30T17:17:43.380999+00:00"
    },
    {
      "id": "6bcff4f4264642d982891d4d3eb220c8",
      "sender": "abubakarsadiq",
      "payload": "yay sjors is here!",
      "action": false,
      "timestamp": "2025-04-30T17:18:10.081501+00:00"
    },
    {
      "id": "565f8fd4a7c1477dbf92d8999754ec6f",
      "sender": "sjors47",
      "payload": "But in Stratum v2 the pool needs to verify that the individual miner is not sending them a fake block.",
      "action": false,
      "timestamp": "2025-04-30T17:18:16.377938+00:00"
    },
    {
      "id": "cc7d1e54c64745998829c9be5ef2c389",
      "sender": "monlovesmango",
      "payload": "is Unix socket more secure than TPC port? I have no idea why else IPC would be advantageous, just trying to ask questions",
      "action": false,
      "timestamp": "2025-04-30T17:18:28.162978+00:00"
    },
    {
      "id": "d5b3adf1bd334f60beb7e57ced00c7cd",
      "sender": "sjors47",
      "payload": "So the way they could do that currently is to use the getblocktemplate RPC in \"proposal\" mode, and basically just give it a serialized hex block.",
      "action": false,
      "timestamp": "2025-04-30T17:18:52.560266+00:00"
    },
    {
      "id": "d5344b760376422eb53bc7c6d2fad2e2",
      "sender": "sjors47",
      "payload": "monlovesmango: I don't think the reason is security",
      "action": false,
      "timestamp": "2025-04-30T17:19:10.625677+00:00"
    },
    {
      "id": "9ef62df4cd4d4136a58ea6a18fdb6e05",
      "sender": "sjors47",
      "payload": "It's just that Russ Ryanofsky, who's been working on multiprocess IPC for many years, added that",
      "action": false,
      "timestamp": "2025-04-30T17:19:25.971696+00:00"
    },
    {
      "id": "3c0aae5a9a90455a894371c9973cc9d7",
      "sender": "abubakarsadiq",
      "payload": "The next question",
      "action": false,
      "timestamp": "2025-04-30T17:19:46.482281+00:00"
    },
    {
      "id": "4761dd5be2464e349a25a2a448549cbb",
      "sender": "abubakarsadiq",
      "payload": "5. What is the key difference between contextual and context-free checks in the block template validity checks?",
      "action": false,
      "timestamp": "2025-04-30T17:19:46.604168+00:00"
    },
    {
      "id": "e68897511c6b403c8048977c98dc51f9",
      "sender": "sjors47",
      "payload": "It might be a bit more performant.",
      "action": false,
      "timestamp": "2025-04-30T17:19:48.515959+00:00"
    },
    {
      "id": "cb07be1f0bfc4e7fb6c029b77362c803",
      "sender": "sjors47",
      "payload": "Continuing as myself under Sjors[m]",
      "action": false,
      "timestamp": "2025-04-30T17:20:47.917067+00:00"
    },
    {
      "id": "a311da917ac241f8a945412f9f300247",
      "sender": "Sjors[m]",
      "payload": "If that works",
      "action": false,
      "timestamp": "2025-04-30T17:20:55.399030+00:00"
    },
    {
      "id": "9c2318ce1f114143bd1588ecea0dc287",
      "sender": "abubakarsadiq",
      "payload": "It works!",
      "action": false,
      "timestamp": "2025-04-30T17:21:04.051788+00:00"
    },
    {
      "id": "38a7072a66f94b78990b97292f4c1083",
      "sender": "monlovesmango",
      "payload": "contextual check references previous block headers",
      "action": false,
      "timestamp": "2025-04-30T17:21:12.424600+00:00"
    },
    {
      "id": "ef0e7859165f42bd97b4e259379ad489",
      "sender": "dzxzg",
      "payload": "From a high level, the no context checks in CheckBlock don't have a view of the chainstate, and the contextual checks do",
      "action": false,
      "timestamp": "2025-04-30T17:21:13.215155+00:00"
    },
    {
      "id": "80f4e74862124bb284a78aec3620c18d",
      "sender": "sebastianvstaa",
      "payload": "context free: can be done without knowledge of blockchain current state",
      "action": false,
      "timestamp": "2025-04-30T17:21:14.461287+00:00"
    },
    {
      "id": "e79aa2e3578245d190651ebee4458d94",
      "sender": "santos",
      "payload": "monlovesmango:\u00a0 Local IPC channels often have lower overhead than TCP and are easy to secure via OS\u2010provided permissions, but they don\u2019t give you the same out-of-the-box, cryptographic authentication (or optional TLS encryption) that you get if you run over TCP.",
      "action": false,
      "timestamp": "2025-04-30T17:21:15.646076+00:00"
    },
    {
      "id": "5a105c0b4cd24d779994e0b3d323375f",
      "sender": "abubakarsadiq",
      "payload": "yep dzxzg",
      "action": false,
      "timestamp": "2025-04-30T17:21:46.210645+00:00"
    },
    {
      "id": "a834687d26f84919a1d77ea61ceda7ad",
      "sender": "abubakarsadiq",
      "payload": "correct sebastianvstaa",
      "action": false,
      "timestamp": "2025-04-30T17:22:05.813565+00:00"
    },
    {
      "id": "ef3f97e872c84d5cbc91d6706c0c0cf2",
      "sender": "monlovesmango",
      "payload": "santos: I see thanks!",
      "action": false,
      "timestamp": "2025-04-30T17:22:11.890552+00:00"
    },
    {
      "id": "e932f463976b421e8606908b543abc15",
      "sender": "stringintech",
      "payload": "Sjors[m] thanks! the PR description made sense to me; just got a bit lost with Sv2 terminology...",
      "action": false,
      "timestamp": "2025-04-30T17:22:27.880473+00:00"
    },
    {
      "id": "a52415cc7caa44ac86fc802acdc57293",
      "sender": "monlovesmango",
      "payload": "is IPC able to process multiple requests at the same time? RPC can't do that right?",
      "action": false,
      "timestamp": "2025-04-30T17:22:43.593632+00:00"
    },
    {
      "id": "3a69d047fdbe4616addc8c80b967e8a1",
      "sender": "Sjors[m]",
      "payload": "stringintech: I don't have the full log before I entered, so feel free to ask a followup question if I missed somethign",
      "action": false,
      "timestamp": "2025-04-30T17:22:56.533623+00:00"
    },
    {
      "id": "552441b2175546a4801bbdd9cff87b39",
      "sender": "abubakarsadiq",
      "payload": "@sjors question why is POW not checked by the pool, but we check that the nBits are valid?",
      "action": false,
      "timestamp": "2025-04-30T17:23:03.713254+00:00"
    },
    {
      "id": "d1edaec2e9cc4844ad2eb76dfd2e97f5",
      "sender": "Sjors[m]",
      "payload": "POW \u001dis\u000f checked by the pool",
      "action": false,
      "timestamp": "2025-04-30T17:23:40.570637+00:00"
    },
    {
      "id": "2cc17d5e2f404a0f8a861b8fb632fbf6",
      "sender": "Sjors[m]",
      "payload": "I dropped that check from the earlier version.",
      "action": false,
      "timestamp": "2025-04-30T17:23:53.993317+00:00"
    },
    {
      "id": "8529929e156c46bf9f095870326cc153",
      "sender": "Sjors[m]",
      "payload": "One bit of context...",
      "action": false,
      "timestamp": "2025-04-30T17:24:07.623479+00:00"
    },
    {
      "id": "15b1b0f596034d2794e4a29544b371ec",
      "sender": "Sjors[m]",
      "payload": "nBits represents the \"real\" work that will be in the final block",
      "action": false,
      "timestamp": "2025-04-30T17:24:27.396302+00:00"
    },
    {
      "id": "d653a76824694bf0b486129a4ef1c6e4",
      "sender": "Sjors[m]",
      "payload": "Shares however use a lower amount of work.",
      "action": false,
      "timestamp": "2025-04-30T17:24:37.968345+00:00"
    },
    {
      "id": "0be957029b8d48f4becae065de71e752",
      "sender": "abubakarsadiq",
      "payload": "ohh yeah I locally have the previous version of the PR",
      "action": false,
      "timestamp": "2025-04-30T17:24:50.773495+00:00"
    },
    {
      "id": "63241684f1f646cf9711799606590744",
      "sender": "Sjors[m]",
      "payload": "So the nBits value won't mach the actual work.",
      "action": false,
      "timestamp": "2025-04-30T17:24:52.393151+00:00"
    },
    {
      "id": "9652731cc11543eaa7d95b9fc858390c",
      "sender": "Sjors[m]",
      "payload": "Bitcoin Core simply ignores that when checking the template, it doesn't check the actual work, it only checks the promise of work.",
      "action": false,
      "timestamp": "2025-04-30T17:25:12.622269+00:00"
    },
    {
      "id": "cb1f5cc8570847bebfddeff9774cad7a",
      "sender": "Sjors[m]",
      "payload": "So the pool needs to check the actual work in the share and pay rewards accordingly.",
      "action": false,
      "timestamp": "2025-04-30T17:25:30.354061+00:00"
    },
    {
      "id": "e476f777a18548c4bc57af25669ec167",
      "sender": "monlovesmango",
      "payload": "so the POW is checked by the pool outside of bitcoin core?",
      "action": false,
      "timestamp": "2025-04-30T17:25:46.048810+00:00"
    },
    {
      "id": "0c7ca941358d40fd8b49a2e1c877d663",
      "sender": "Sjors[m]",
      "payload": "And the share has enough work for the whole network to accept it, then it immediately gets broadcast (and you get your share payment).",
      "action": false,
      "timestamp": "2025-04-30T17:25:55.203196+00:00"
    },
    {
      "id": "23a725de635d4a1992e51478610ba034",
      "sender": "Sjors[m]",
      "payload": "monlovesmango: yes",
      "action": false,
      "timestamp": "2025-04-30T17:26:05.498284+00:00"
    },
    {
      "id": "36a64016abff4a48b9cb00b85581cf5c",
      "sender": "Sjors[m]",
      "payload": "One way to describe a \"share\" would be as a weak block.",
      "action": false,
      "timestamp": "2025-04-30T17:26:34.223806+00:00"
    },
    {
      "id": "9a4da51f3e0240d18bce69eb6790fd35",
      "sender": "Sjors[m]",
      "payload": "(extremely weak)",
      "action": false,
      "timestamp": "2025-04-30T17:26:58.763565+00:00"
    },
    {
      "id": "376e34b87aea48f88d152b6eee337fdd",
      "sender": "abubakarsadiq",
      "payload": "thanks @sjors",
      "action": false,
      "timestamp": "2025-04-30T17:27:12.911657+00:00"
    },
    {
      "id": "dd75016b309541c59fb5674973ed5a57",
      "sender": "Sjors[m]",
      "payload": "santos: you can even do a unix socket of SSH quite easily",
      "action": false,
      "timestamp": "2025-04-30T17:27:28.277861+00:00"
    },
    {
      "id": "46b3654892514abf84f1b3a1d26c15b7",
      "sender": "Sjors[m]",
      "payload": "* over",
      "action": false,
      "timestamp": "2025-04-30T17:27:32.173859+00:00"
    },
    {
      "id": "a76222b748c34b89b5499c1c818d34e2",
      "sender": "abubakarsadiq",
      "payload": "next question",
      "action": false,
      "timestamp": "2025-04-30T17:27:33.744894+00:00"
    },
    {
      "id": "ad9993b39e234954849fa8c14c6a1657",
      "sender": "abubakarsadiq",
      "payload": "Is there a change in behavior for TestBlockValidity after this PR, or is it a pure refactor? If yes, what\u2019s the change?",
      "action": false,
      "timestamp": "2025-04-30T17:27:33.866942+00:00"
    },
    {
      "id": "60715e830d3140e3b77654177ac1b509",
      "sender": "sebastianvstaa",
      "payload": "yes. Returns a boolean value and a string instead in BlockVAlidationState object",
      "action": false,
      "timestamp": "2025-04-30T17:28:25.772704+00:00"
    },
    {
      "id": "2592021640ab49f1bc8186429e96ad7e",
      "sender": "sebastianvstaa",
      "payload": "but I wonder why? Why a string instead of a state enum? Seems cumbersome",
      "action": false,
      "timestamp": "2025-04-30T17:28:57.507948+00:00"
    },
    {
      "id": "84443420ba7845c89101e04fa82287c3",
      "sender": "dzxzg",
      "payload": "It also no longer logs block invalidity reasons as errors",
      "action": false,
      "timestamp": "2025-04-30T17:29:04.031342+00:00"
    },
    {
      "id": "0cd53496e2b34687be74bc7779a13a97",
      "sender": "monlovesmango",
      "payload": "I thought it always returned bool?",
      "action": false,
      "timestamp": "2025-04-30T17:29:04.539109+00:00"
    },
    {
      "id": "45877cc978b74032a83569abde75fe7a",
      "sender": "stringintech",
      "payload": "i noticed two main changes; the error handling and the CheckBlock (a context-free check) which is called before the contextual header check.",
      "action": false,
      "timestamp": "2025-04-30T17:29:15.483675+00:00"
    },
    {
      "id": "a1a572574e894b5691b99e46132c8e48",
      "sender": "stringintech",
      "payload": "and i guess the second one could be considered a behavioral change.",
      "action": false,
      "timestamp": "2025-04-30T17:29:15.963134+00:00"
    },
    {
      "id": "b89590e37f2c412a87410eb1ef778d9e",
      "sender": "Sjors[m]",
      "payload": "BlockVAlidationState required a bunch of custom code to serialize over IPC",
      "action": false,
      "timestamp": "2025-04-30T17:29:22.910410+00:00"
    },
    {
      "id": "71b1209eff3949419f3e9611f9197898",
      "sender": "abubakarsadiq",
      "payload": "@sebastianvstaa: Is that a behavior change?",
      "action": false,
      "timestamp": "2025-04-30T17:29:34.991113+00:00"
    },
    {
      "id": "48c2bccaa8ca462093d2a0f04e505602",
      "sender": "abubakarsadiq",
      "payload": "I think it's the same return values we get previously just in another as boolean and strings now",
      "action": false,
      "timestamp": "2025-04-30T17:29:35.113106+00:00"
    },
    {
      "id": "f731b1d46a6b42dcae0f3266c9523a1c",
      "sender": "santos",
      "payload": "context-free checks (CheckBlock) are done first now",
      "action": false,
      "timestamp": "2025-04-30T17:29:41.125411+00:00"
    },
    {
      "id": "4159b515941e4bb78ee04aa133c4e27f",
      "sender": "dzxzg",
      "payload": "monlovesmango: https://github.com/bitcoin/bitcoin/blob/14b8dfb2bd5e2ca2b7c0c9a7f7d50e1e60adf75c/src/rpc/mining.cpp#L725-L766",
      "action": false,
      "timestamp": "2025-04-30T17:29:57.824996+00:00"
    },
    {
      "id": "625cd6fa0c3c4902bbcba216ac1834d2",
      "sender": "abubakarsadiq",
      "payload": "@sjors this brings us to another question  In commit cca5993b, can you clarify the note that serialization of BlockValidationState is \u201cfragile\u201d?",
      "action": false,
      "timestamp": "2025-04-30T17:30:07.259353+00:00"
    },
    {
      "id": "f03f1cc588304b9f98bfc5791b85e368",
      "sender": "Sjors[m]",
      "payload": "I didn't write that note :-)",
      "action": false,
      "timestamp": "2025-04-30T17:30:21.352993+00:00"
    },
    {
      "id": "380c0143fc8540c08292ed87045d02c7",
      "sender": "Sjors[m]",
      "payload": "I just saw it as an excuse to delete it.",
      "action": false,
      "timestamp": "2025-04-30T17:30:29.392436+00:00"
    },
    {
      "id": "7da2c499508949eb9946d17417fd5d06",
      "sender": "abubakarsadiq",
      "payload": ":D",
      "action": false,
      "timestamp": "2025-04-30T17:30:33.774675+00:00"
    },
    {
      "id": "e265a172992b46d79600258c6e515b41",
      "sender": "Sjors[m]",
      "payload": "For historical background how this PR came about...",
      "action": false,
      "timestamp": "2025-04-30T17:30:51.538365+00:00"
    },
    {
      "id": "39557a92ad74482a8a4bb07ab5830134",
      "sender": "Sjors[m]",
      "payload": "I initially didn't know about the proposal mode",
      "action": false,
      "timestamp": "2025-04-30T17:31:03.681988+00:00"
    },
    {
      "id": "38d0fe568cd7460d90610d3904201e65",
      "sender": "Sjors[m]",
      "payload": "So I ended up implementing all these checks and then realize it was duplicate work",
      "action": false,
      "timestamp": "2025-04-30T17:31:16.923948+00:00"
    },
    {
      "id": "c99b596d72404c30bc29d71ef2d5af4a",
      "sender": "abubakarsadiq",
      "payload": "yeah I could not answer that as well maybe @ryanofsky can help here.",
      "action": false,
      "timestamp": "2025-04-30T17:31:35.506285+00:00"
    },
    {
      "id": "4c708a2b77004af7aaeddc63bc25e57c",
      "sender": "Sjors[m]",
      "payload": "So then I gradually changed my implementation to be closer to the original.",
      "action": false,
      "timestamp": "2025-04-30T17:31:36.062143+00:00"
    },
    {
      "id": "dec4e5452f47495da3b32e47b451f384",
      "sender": "Sjors[m]",
      "payload": "So may be that my initial design just used a boolean return with a string message.",
      "action": false,
      "timestamp": "2025-04-30T17:32:02.921012+00:00"
    },
    {
      "id": "0b6edd14d6134af8bd59ab160a04db26",
      "sender": "dzxzg",
      "payload": "I'm not too familiar with the IPC interface, but is serialization of complex C++ types a problem in general?",
      "action": false,
      "timestamp": "2025-04-30T17:32:19.911075+00:00"
    },
    {
      "id": "589237c7c8fe413996263fc40ff6e910",
      "sender": "Sjors[m]",
      "payload": "But it had the benefit of not needing that BlockValidationState struct, so I kept it.",
      "action": false,
      "timestamp": "2025-04-30T17:32:23.657882+00:00"
    },
    {
      "id": "2cf1356dd1f8476f9777d51a9b169f00",
      "sender": "abubakarsadiq",
      "payload": "The next question is",
      "action": false,
      "timestamp": "2025-04-30T17:32:45.284171+00:00"
    },
    {
      "id": "185c66e397b843e4bee04bec16c31101",
      "sender": "abubakarsadiq",
      "payload": "One of the reasons for locking `cs_main` in `TestBlockValidity` is to prevent `CheckBlock` race conditions. Can you describe a scenario when that might happen?",
      "action": false,
      "timestamp": "2025-04-30T17:32:45.406086+00:00"
    },
    {
      "id": "3e155b963efc4fc1afc34da28d1980d8",
      "sender": "Sjors[m]",
      "payload": "dzxzg: not sure about \"complex\" but basically every type has its own serialization logic.",
      "action": false,
      "timestamp": "2025-04-30T17:33:03.178643+00:00"
    },
    {
      "id": "5a43818bae2f4323988feff3992a6303",
      "sender": "Sjors[m]",
      "payload": "With some \"universal\" things like byte spans.",
      "action": false,
      "timestamp": "2025-04-30T17:33:18.182859+00:00"
    },
    {
      "id": "9318420198594c0c893b3b94d070ec55",
      "sender": "Sjors[m]",
      "payload": "So anything that can be serialzed on the p2p network can be handled in a similar way with no extra IPC code.",
      "action": false,
      "timestamp": "2025-04-30T17:33:41.615639+00:00"
    },
    {
      "id": "6236968e05bb4007bc78e07ca70ac73f",
      "sender": "Sjors[m]",
      "payload": "But BlockValidationState is an internal type, so there's no serialization for it.",
      "action": false,
      "timestamp": "2025-04-30T17:33:56.998182+00:00"
    },
    {
      "id": "94ea340a47234162865dc2fff475085e",
      "sender": "monlovesmango",
      "payload": "if checkblock is called for multiple blocks?",
      "action": false,
      "timestamp": "2025-04-30T17:34:05.244774+00:00"
    },
    {
      "id": "7670ac438e164426a6e5214775798a2a",
      "sender": "Sjors[m]",
      "payload": "See this commit for how it was serialized: https://github.com/bitcoin/bitcoin/pull/31981/commits/9822bd64d26ca056c0fe44e5e2b3e1f38e6021ef",
      "action": false,
      "timestamp": "2025-04-30T17:34:27.467564+00:00"
    },
    {
      "id": "2a82a05572924a89af81853a2f882929",
      "sender": "Sjors[m]",
      "payload": "monlovesmango: one block at a time",
      "action": false,
      "timestamp": "2025-04-30T17:34:34.519270+00:00"
    },
    {
      "id": "6cae9e3635ef45c893ac143f1490841a",
      "sender": "Sjors[m]",
      "payload": "But potentially extremely frequently.",
      "action": false,
      "timestamp": "2025-04-30T17:34:46.334049+00:00"
    },
    {
      "id": "f1772db647744d239a39a68dc3214012",
      "sender": "stringintech",
      "payload": "aren't we working with a fresh instance of a block each time we get into TestBlockValidity?",
      "action": false,
      "timestamp": "2025-04-30T17:34:47.759691+00:00"
    },
    {
      "id": "643169b3407549c2975f3b8c90e2c953",
      "sender": "dzxzg",
      "payload": "So the main reason for the refactor is to drop the `CustomBuildMessage()` logic for BlockValidationState",
      "action": false,
      "timestamp": "2025-04-30T17:34:49.441084+00:00"
    },
    {
      "id": "bf2c9f4aa55849d5b8d8d20f79e45042",
      "sender": "Sjors[m]",
      "payload": "Let's say you're a pool and there's 10000 miners that are each proposing a new block every 1 second... and you want to check them all...",
      "action": false,
      "timestamp": "2025-04-30T17:35:11.159344+00:00"
    },
    {
      "id": "ada08b9d400e4f608079d00af8a2ff81",
      "sender": "Sjors[m]",
      "payload": "That would probably crash the node :-)",
      "action": false,
      "timestamp": "2025-04-30T17:35:19.003081+00:00"
    },
    {
      "id": "0593b1d86d024bd4ade52f96fdf05c36",
      "sender": "Sjors[m]",
      "payload": "But you spin up multiple nodes to distribute the checking work.",
      "action": false,
      "timestamp": "2025-04-30T17:35:39.778843+00:00"
    },
    {
      "id": "92996d84cf594f6ab879c848c5fc8cf6",
      "sender": "abubakarsadiq",
      "payload": "@monlovesmango: what do you mean by \"called for multiple blocks? \"",
      "action": false,
      "timestamp": "2025-04-30T17:35:48.758193+00:00"
    },
    {
      "id": "b4642621b49542338609c7374b160296",
      "sender": "Sjors[m]",
      "payload": "stringintech: yes",
      "action": false,
      "timestamp": "2025-04-30T17:36:16.851886+00:00"
    },
    {
      "id": "89084a205b444c20adcdcd4637c135e1",
      "sender": "monlovesmango",
      "payload": "that checkblock is called for different block candidates that are found very close in time",
      "action": false,
      "timestamp": "2025-04-30T17:36:57.116857+00:00"
    },
    {
      "id": "d88958dc5fa44bc7b6253a5a10bd93a7",
      "sender": "abubakarsadiq",
      "payload": "@sjors is it possible we receive the same block from the P2P network and are trying to validate and update its state, while simultaneously calling getblocktemplate in proposal mode with same block. that would cause a race no?",
      "action": false,
      "timestamp": "2025-04-30T17:37:20.928151+00:00"
    },
    {
      "id": "204206b2b7ac4a1691e931ef0c594f8a",
      "sender": "stringintech",
      "payload": "Sjors[m]: So we only need to slow things down here (implicitly create a queue)?",
      "action": false,
      "timestamp": "2025-04-30T17:37:21.460110+00:00"
    },
    {
      "id": "2ecdae93b5d849cb8ff7b6d96a27713c",
      "sender": "Sjors[m]",
      "payload": "abubakarsadiq: yes all that can happen at the same time",
      "action": false,
      "timestamp": "2025-04-30T17:37:38.178525+00:00"
    },
    {
      "id": "c5192da0e0cc4669b744f7fd731e3347",
      "sender": "Sjors[m]",
      "payload": "Even without this feature, I ran into the problem with Stratum v2 that we braodcast our own blocks now.",
      "action": false,
      "timestamp": "2025-04-30T17:38:04.995952+00:00"
    },
    {
      "id": "e0928c62a69a4755959ace0732474887",
      "sender": "Sjors[m]",
      "payload": "At the same time the pool is also broadcasting it",
      "action": false,
      "timestamp": "2025-04-30T17:38:14.688850+00:00"
    },
    {
      "id": "db8d7dbf7c3a4a79ac9386a8e5ee1488",
      "sender": "Sjors[m]",
      "payload": "So you can have a race where we receive a block over p2p (coming from the pool) and we're publishing one ourselves.",
      "action": false,
      "timestamp": "2025-04-30T17:38:41.042258+00:00"
    },
    {
      "id": "9cf53f2c3b3f4c14afd7159a3284a06b",
      "sender": "Sjors[m]",
      "payload": "I believe I took care of those races.",
      "action": false,
      "timestamp": "2025-04-30T17:38:49.271077+00:00"
    },
    {
      "id": "d1b3522f73134c2ba611b99e71856493",
      "sender": "abubakarsadiq",
      "payload": "monlovesmango: I don't think that will cause a race since they are not identical blocks, even if they are identical correct me if I am wrong @sjors. `TestBlockValidity` does not save the block so a race will not happen no?",
      "action": false,
      "timestamp": "2025-04-30T17:39:00.754407+00:00"
    },
    {
      "id": "3229eb1c76d7426e8c35396ce5a26ecc",
      "sender": "Sjors[m]",
      "payload": "Now with checkBlock we never broadcast it.",
      "action": false,
      "timestamp": "2025-04-30T17:39:08.508263+00:00"
    },
    {
      "id": "6626a03ae29642889cbaef740799d74f",
      "sender": "monlovesmango",
      "payload": "abubakarsadiq: gotcha, thanks",
      "action": false,
      "timestamp": "2025-04-30T17:39:33.037292+00:00"
    },
    {
      "id": "65422529e2e64651a3634dbb399ca644",
      "sender": "dzxzg",
      "payload": "Why does the PR move responsibility for locking cs_main from the caller to testblockvalidity",
      "action": false,
      "timestamp": "2025-04-30T17:39:40.459387+00:00"
    },
    {
      "id": "e43be21d73c44f0296d87e32159ae7cc",
      "sender": "santos",
      "payload": "So now is checkBlock() called when the node receiver a new block or when the pool receives a new block template proposal ? Is this correct ?",
      "action": false,
      "timestamp": "2025-04-30T17:39:41.643832+00:00"
    },
    {
      "id": "e399e8b2011b4fda830e3cb5adcdcb8a",
      "sender": "abubakarsadiq",
      "payload": "when called via getblocktemplate in proposal mode",
      "action": false,
      "timestamp": "2025-04-30T17:39:43.517246+00:00"
    },
    {
      "id": "aa69443307124d52af406da6f80df27d",
      "sender": "Sjors[m]",
      "payload": "The blocking of cs_main however is of course not good for the pool if they're trying to stay up to date.",
      "action": false,
      "timestamp": "2025-04-30T17:40:25.928432+00:00"
    },
    {
      "id": "60fb341ff4114dc4b0ababf8b64e1368",
      "sender": "Sjors[m]",
      "payload": "So probably they should run these checks on different nodes than they use for contructing their own (default) block.",
      "action": false,
      "timestamp": "2025-04-30T17:40:43.965973+00:00"
    },
    {
      "id": "50b2cfb47c8748c19dc4245bd459d194",
      "sender": "abubakarsadiq",
      "payload": "Lets move to the next question",
      "action": false,
      "timestamp": "2025-04-30T17:41:20.603479+00:00"
    },
    {
      "id": "6482ea3ecae34cf69994e5e916e84ff6",
      "sender": "abubakarsadiq",
      "payload": "In commit 1d029c23, why do we assert that `fChecked` should return `false`? Is this a potential issue?",
      "action": false,
      "timestamp": "2025-04-30T17:41:20.725285+00:00"
    },
    {
      "id": "7957ac22184244d0a3e2f0a30912c5fb",
      "sender": "stringintech",
      "payload": "abubakarsadiq: I thought so (regarding your explaination race condition for identical blocks) but i noticed in the code that may be worried about a race condition on fChecked flag; which i could not understand why.",
      "action": false,
      "timestamp": "2025-04-30T17:41:28.288260+00:00"
    },
    {
      "id": "4e5eb88f7d0445a0869cfc80ec6bf9ea",
      "sender": "Sjors[m]",
      "payload": "santos: when the pool receives a block _proposal_",
      "action": false,
      "timestamp": "2025-04-30T17:41:32.328243+00:00"
    },
    {
      "id": "198ed5cf539c4306baec36c9d118de3a",
      "sender": "abubakarsadiq",
      "payload": "Note: this is in an earlier version of the PR",
      "action": false,
      "timestamp": "2025-04-30T17:41:48.155411+00:00"
    },
    {
      "id": "73ef32df359f43a29141ba3d343b8bde",
      "sender": "Sjors[m]",
      "payload": "I was going to say, I dropped some of those checks.",
      "action": false,
      "timestamp": "2025-04-30T17:42:02.698653+00:00"
    },
    {
      "id": "c55431ab04054fb2a16b883248770a2d",
      "sender": "abubakarsadiq",
      "payload": "stringintech: I mentioned that will not be an issue for identical blocks when called via the RPC because we dont save the state.",
      "action": false,
      "timestamp": "2025-04-30T17:43:03.239403+00:00"
    },
    {
      "id": "6ec40fc0d38c42998ea00ce10fc515f5",
      "sender": "abubakarsadiq",
      "payload": "yeah @sjors to answer the question myself I was a bit confused by the assertion. I believe it is an issue we should return instead. We might attempt to check a block that we already received via P2P and stored it's state.",
      "action": false,
      "timestamp": "2025-04-30T17:44:04.830111+00:00"
    },
    {
      "id": "27e6b528d5654e85a9c10c327eca4980",
      "sender": "Sjors[m]",
      "payload": "Mmm, one of the first checks if fChecked",
      "action": false,
      "timestamp": "2025-04-30T17:45:28.268275+00:00"
    },
    {
      "id": "fb8354b448974942b2a8078d0be1364f",
      "sender": "Sjors[m]",
      "payload": "block.hashPrevBlock != *Assert(tip->phashBlock)",
      "action": false,
      "timestamp": "2025-04-30T17:45:31.147872+00:00"
    },
    {
      "id": "31afa6eefe8c4c6cb7569f1b59caa2b8",
      "sender": "Sjors[m]",
      "payload": "And we've locked m_chainman by then",
      "action": false,
      "timestamp": "2025-04-30T17:46:00.562164+00:00"
    },
    {
      "id": "d0b9ebf0e6004161879f32e6304e1ef2",
      "sender": "stringintech",
      "payload": "abubakarsadiq: yes i understand that. which is why i didnt get why we are worried about the fChecked race condition (not sure if i read this in the code comments or commit description or ...)",
      "action": false,
      "timestamp": "2025-04-30T17:46:08.440052+00:00"
    },
    {
      "id": "4085a75b8f2842a2b2aeef85e54a12eb",
      "sender": "abubakarsadiq",
      "payload": "This assertion ` Assert(!block.fChecked);`",
      "action": false,
      "timestamp": "2025-04-30T17:46:33.680323+00:00"
    },
    {
      "id": "3f8f79e010cb4821a23cdf613a81ca3c",
      "sender": "Sjors[m]",
      "payload": "I initially wrote some assert and assume statement to sanity check my own changes.",
      "action": false,
      "timestamp": "2025-04-30T17:46:40.923137+00:00"
    },
    {
      "id": "87fd2764743b4530a7dc217efc8868fb",
      "sender": "Sjors[m]",
      "payload": "But this was a few months ago, so I don't remember either why that particular assert.",
      "action": false,
      "timestamp": "2025-04-30T17:47:32.958099+00:00"
    },
    {
      "id": "bfeaa83572f241339334999ef1f31ff3",
      "sender": "Sjors[m]",
      "payload": "And it's gone now.",
      "action": false,
      "timestamp": "2025-04-30T17:47:40.545790+00:00"
    },
    {
      "id": "326d46f9462a48c0a7acb390d551cabc",
      "sender": "dzxzg",
      "payload": "It seems like avoiding BlockValidationState is a nice win for the IPC interface, but it would be nice for internal users of `TestBlockValidity` to have the enum... I wonder\u00a0 the refactor would be simpler if testblockvalidity remained mostly as is and you placed a little wrapper around TestBlockValidity, that returns a bool and modifies the passed",
      "action": false,
      "timestamp": "2025-04-30T17:48:16.673646+00:00"
    },
    {
      "id": "24f9ff814ffc42168fa3d7952717d5e9",
      "sender": "abubakarsadiq",
      "payload": "It is in this commit https://github.com/bitcoin-core-review-club/bitcoin/blob/1d029c23a143f1b9110377967a7c4a20ee75058d/src/validation.cpp#L4662",
      "action": false,
      "timestamp": "2025-04-30T17:48:16.795547+00:00"
    },
    {
      "id": "9aa530b589f342ee86e406aaf1fd13f9",
      "sender": "dzxzg",
      "payload": "in strings,",
      "action": false,
      "timestamp": "2025-04-30T17:48:17.172714+00:00"
    },
    {
      "id": "b8b15c2065374a8a8efc4e4c0a9648ec",
      "sender": "monlovesmango",
      "payload": "so can someone summarize what race condition we are trying to prevent when locking `cs_main` in `TestBlockValidity`?",
      "action": false,
      "timestamp": "2025-04-30T17:48:27.554014+00:00"
    },
    {
      "id": "7798bb6ad2ef4acca6ede6e03a2b8e81",
      "sender": "stringintech",
      "payload": "monlovesmango: \ud83d\udc4d",
      "action": false,
      "timestamp": "2025-04-30T17:49:06.272549+00:00"
    },
    {
      "id": "44863d286a7e481385a5c771e424ba08",
      "sender": "abubakarsadiq",
      "payload": "Final Question In this  https://github.com/bitcoin/bitcoin/blob/9efe5466885862bc1fb830524f7ce23e785fcac0/src/validation.cpp#L4078 `CheckBlock` size check, which size rule are we checking? Is it an overestimate check? Which size check is missing there?",
      "action": false,
      "timestamp": "2025-04-30T17:49:12.785394+00:00"
    },
    {
      "id": "75d21432b4704b4d9a088ad9b6d6a90c",
      "sender": "monlovesmango",
      "payload": "I understand the lock is needed to prevent tip from updating, but want to understand the race condition element too",
      "action": false,
      "timestamp": "2025-04-30T17:49:58.680419+00:00"
    },
    {
      "id": "291efc7160754f079db3b33b80ca4b1a",
      "sender": "abubakarsadiq",
      "payload": "dzxzg: what will be the benefit of that, how will the enum be useful, is not the same as the boolean output?",
      "action": false,
      "timestamp": "2025-04-30T17:50:36.800140+00:00"
    },
    {
      "id": "2770c74311894c0f97f55cb81217737a",
      "sender": "stringintech",
      "payload": "abubakarsadiq: Witness data is excluded when performing the check, but later in ContextualCheckBlock we consider it (block weight check).",
      "action": false,
      "timestamp": "2025-04-30T17:51:01.397431+00:00"
    },
    {
      "id": "f8a29874d7d34bbcada8785a8b7f3c04",
      "sender": "monlovesmango",
      "payload": "I didn't quite undertand the size check logic, but looks like validating there are txs, and that it doesn't exceed max block size",
      "action": false,
      "timestamp": "2025-04-30T17:51:03.072791+00:00"
    },
    {
      "id": "86466c8dc1c34587a8a0e7e7b52a658f",
      "sender": "abubakarsadiq",
      "payload": "stringintech: we also do weight check there but why is it not enough?",
      "action": false,
      "timestamp": "2025-04-30T17:52:33.047801+00:00"
    },
    {
      "id": "39164f73cd7344fb8df2506254cec50c",
      "sender": "dzxzg",
      "payload": "abubakarsadiq: Every caller of TestBlockValidity cares about two things: Was it valid? If not, what was the reason? That is solved in a precise and reusable way with an enum. It seems to me that only the ipc interface suffers from the awkardness of packing and serializing all of this over the wire.",
      "action": false,
      "timestamp": "2025-04-30T17:54:23.561708+00:00"
    },
    {
      "id": "d0f2176103cb43ee98b3855fa12e11f6",
      "sender": "abubakarsadiq",
      "payload": "monlovesmango: same also I don\u2019t understand the second check: `block.vtx.size() * WITNESS_SCALE_FACTOR > MAX_BLOCK_WEIGHT`",
      "action": false,
      "timestamp": "2025-04-30T17:54:47.215452+00:00"
    },
    {
      "id": "6d3bebbf89c44d5bba0dd43b2e108cc5",
      "sender": "Sjors[m]",
      "payload": "dzxzg: the caller ultimately only gets a BIP22 string",
      "action": false,
      "timestamp": "2025-04-30T17:55:12.038394+00:00"
    },
    {
      "id": "a80e0349e36a4fd1abf3392762d9ac0d",
      "sender": "Sjors[m]",
      "payload": "This was is the case the getblocktemplate RPC too.",
      "action": false,
      "timestamp": "2025-04-30T17:55:29.183026+00:00"
    },
    {
      "id": "6085dd0a49bb4fe0a143e421d004e618",
      "sender": "Sjors[m]",
      "payload": "Enum is used internally.",
      "action": false,
      "timestamp": "2025-04-30T17:55:33.901983+00:00"
    },
    {
      "id": "25ed174a3eb949fc99c4c9fb4d19da74",
      "sender": "dzxzg",
      "payload": "By caller I mean internal users",
      "action": false,
      "timestamp": "2025-04-30T17:55:55.401203+00:00"
    },
    {
      "id": "819c445290c842c8b1880c2497ffa22c",
      "sender": "Sjors[m]",
      "payload": "Remember that RPC uses JSON, which is even worse in terms of what you can serialize",
      "action": false,
      "timestamp": "2025-04-30T17:56:03.913227+00:00"
    },
    {
      "id": "c193cc84a594466d88e18b98d18e001c",
      "sender": "stringintech",
      "payload": "abubakarsadiq: if you mean why CheckBlock size check is not enough because we are not considering witness data and until we are sure the witness data is not tempered with in ContextualCheckBlock we can not check it?",
      "action": false,
      "timestamp": "2025-04-30T17:56:18.864022+00:00"
    },
    {
      "id": "c8840eec95ed4f2c8ecdff9873ed8ce8",
      "sender": "Sjors[m]",
      "payload": "dzxzg: true",
      "action": false,
      "timestamp": "2025-04-30T17:56:20.894783+00:00"
    },
    {
      "id": "4a7cd52361db4454a8f738cf3439bed2",
      "sender": "abubakarsadiq",
      "payload": "Yeah I think it is an overestimate check for the weight that enable us to fail fast when  the non-witness block weight exceed the maximum block weight.",
      "action": false,
      "timestamp": "2025-04-30T17:58:01.770587+00:00"
    },
    {
      "id": "01f3e242ce5a43a989f3b58dfc41543e",
      "sender": "abubakarsadiq",
      "payload": "But yeah we do check the witness weight as well",
      "action": false,
      "timestamp": "2025-04-30T17:58:19.240228+00:00"
    },
    {
      "id": "0d434a26588e43a6bbda9786bf4d9554",
      "sender": "monlovesmango",
      "payload": "I can understand not using teh enum if we are actually getting rid of the enum altogether. but if the enum is going to continue to exists it seems better to use the enum for consistency",
      "action": false,
      "timestamp": "2025-04-30T17:58:59.876488+00:00"
    },
    {
      "id": "445a626d537a4d55accb9589f0862359",
      "sender": "Sjors[m]",
      "payload": "dzxzg: Russ also suggested in his recent review to keep the enum, but I'm not entirely sure why yet: https://github.com/bitcoin/bitcoin/pull/31981#discussion_r2035713597",
      "action": false,
      "timestamp": "2025-04-30T17:59:18.386955+00:00"
    },
    {
      "id": "a871bf094a44423eb3bea997ab7aaa1b",
      "sender": "Sjors[m]",
      "payload": "So maybe it'll come back, we'll see",
      "action": false,
      "timestamp": "2025-04-30T17:59:31.086913+00:00"
    },
    {
      "id": "78b00d9a689b44bea4245ca4dc59e6a2",
      "sender": "abubakarsadiq",
      "payload": "#endmeeting",
      "action": false,
      "timestamp": "2025-04-30T18:00:08.822058+00:00"
    }
  ],
  "events": [
    {
      "event_type": "START_MEETING",
      "message": {
        "id": "91e713c204434473a7a7f3738230e5c2",
        "sender": "abubakarsadiq",
        "payload": "#startmeeting",
        "action": false,
        "timestamp": "2025-04-30T17:00:14.030965+00:00"
      },
      "operand": null,
      "id": "91e713c204434473a7a7f3738230e5c2",
      "timestamp": "2025-04-30T17:00:14.030965+00:00"
    },
    {
      "event_type": "END_MEETING",
      "message": {
        "id": "78b00d9a689b44bea4245ca4dc59e6a2",
        "sender": "abubakarsadiq",
        "payload": "#endmeeting",
        "action": false,
        "timestamp": "2025-04-30T18:00:08.822058+00:00"
      },
      "operand": null,
      "id": "78b00d9a689b44bea4245ca4dc59e6a2",
      "timestamp": "2025-04-30T18:00:08.822058+00:00"
    }
  ],
  "aliases": {},
  "vote_in_progress": false,
  "motion_index": null
}