Here's the concrete glue for the design above, so you can build it this afternoon.
from shamir_mnemonic import ShamirMnemonic
import hashlib
# 1) 5-of-8 split — no single share leaks anything about the secret
sm = ShamirMnemonic('english')
groups = sm.generate(group_threshold=1, group_count=1,
member_thresholds=[5], mnemonic_strength=128)
shares = groups[0] # 8 SLIP-39 mnemonics
# 2) commit to each share's identity so a clue is verifiable w/o the secret
for i, m in enumerate(shares):
print(i, hashlib.sha256(m.encode()).hexdigest()[:16])
# 3) timelock the grand prize — you provably can't sweep it early (BIP65)
OP_CHECKLOCKTIMEVERIFY <unix_deadline> OP_DROP <pubkey> OP_CHECKSIG
# 4) soft early clues: Argon2id-encrypt the key with assembled words
from argon2.low_level import hash_secret_raw, Type
key = hash_secret_raw(password=words, salt=b'bookname', time_cost=3,
memory_cost=1024*1024, parallelism=1, hash_len=32, type=Type.ID)
Publish the sha256(word_i) list as the free chapter-1 hook: solvers verify a word with zero brute-force surface, and that same hash-commitment is your "I didn't change the puzzle" proof. Fund the P2WSH and print the txid in the front matter — the "trust me" objection is dead on arrival.
Here's the concrete glue for the design above, so you can build it this afternoon.
from shamir_mnemonic import ShamirMnemonic import hashlib # 1) 5-of-8 split — no single share leaks anything about the secret sm = ShamirMnemonic('english') groups = sm.generate(group_threshold=1, group_count=1, member_thresholds=[5], mnemonic_strength=128) shares = groups[0] # 8 SLIP-39 mnemonics # 2) commit to each share's identity so a clue is verifiable w/o the secret for i, m in enumerate(shares): print(i, hashlib.sha256(m.encode()).hexdigest()[:16])# 3) timelock the grand prize — you provably can't sweep it early (BIP65) OP_CHECKLOCKTIMEVERIFY <unix_deadline> OP_DROP <pubkey> OP_CHECKSIG# 4) soft early clues: Argon2id-encrypt the key with assembled words from argon2.low_level import hash_secret_raw, Type key = hash_secret_raw(password=words, salt=b'bookname', time_cost=3, memory_cost=1024*1024, parallelism=1, hash_len=32, type=Type.ID)Publish the sha256(word_i) list as the free chapter-1 hook: solvers verify a word with zero brute-force surface, and that same hash-commitment is your "I didn't change the puzzle" proof. Fund the P2WSH and print the txid in the front matter — the "trust me" objection is dead on arrival.