Skip to content

Conversation

Sjors
Copy link
Member

@Sjors Sjors commented Jul 21, 2025

Another step towards #785.

Usage:

First register a policy with #791, #647, MooSig or some other method.

Construct a PSBT.

And then try to sign it.

hwi --device-type ledger signtx --policy-name "MooSig" --policy-desc "tr(musig(@0,@1)" --key [00000001/87'/0'/0']xpub... --key [00000002/87'/0'/0']xpub... --hmac 00... psbt...

{"psbt": "00......"}

It's easiest to test this with just a single sig wallet. Using #791 you can easily register it and get an hmac (even though registration isn't mandatory).

If you want to try with MuSig, you'll need either #784 or use a Bitcoin Core branch with PSBTv2 support (bitcoin/bitcoin#21283). I still need to test both these approaches.

Strongly overlaps with #647, but this implements signing independent of registration.

Based on:

This was referenced Jul 21, 2025
Sjors and others added 26 commits July 22, 2025 10:54
```
error: "/home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/Cargo.lock" does not exist, unable to build with the standard library, try:
        rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
```

https://github.com/bitcoin-core/HWI/actions/runs/16440824447/job/46462763374?pr=795
We can now use the main esp-idf toochain to install the appropriate
version of the qemu emulator, rather than building it ourselves from
source.  Mirrors change recently made to Jade repo.
See e.g. https://github.com/bitcoin-core/HWI/actions/runs/16440824447/job/46463441252

```
work/bitcoin/build/bin/bitcoind: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by work/bitcoin/build/bin/bitcoind)
````

Job lingered for 45 minutes.
Manually re-applied the patch after the original code seems to have
moved around a bit.
```
ERROR: coldcard: test_signtx (test_device.TestSignTx.test_signtx) (addrtypes=['legacy'], multisig_types=['legacy'], external=True, op_return=False)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/__w/HWI/HWI/test/test_device.py", line 588, in test_signtx
    self._test_signtx(addrtypes, multisig_types, external, op_return)
  File "/__w/HWI/HWI/test/test_device.py", line 576, in _test_signtx
    self._generate_and_finalize(True, psbt)
  File "/__w/HWI/HWI/test/test_device.py", line 403, in _generate_and_finalize
    self.assertTrue(first_sign_res["signed"])
                    ~~~~~~~~~~~~~~^^^^^^^^^^
KeyError: 'signed'
```
This reverts commit edab2af.

The always() option is too powerfull. The next commit implements
an alternative solution to the original issue.
This ensures the failure to build a simulator for one device
doesn't abort running jobs for the others. They're still grouped
by manufacturer.

Alternative to bitcoin-core#743.
Build failure on ubuntu-latest:

```
../py/stackctrl.c: In function ‘mp_stack_ctrl_init’:
../py/stackctrl.c:32:32: error: storing the address of local variable ‘stack_dummy’ in ‘mp_state_ctx.thread.stack_top’ [-Werror=dangling-pointer=]
   32 |     MP_STATE_THREAD(stack_top) = (char *)&stack_dummy;
../py/stackctrl.c:31:18: note: ‘stack_dummy’ declared here
   31 |     volatile int stack_dummy;
      |                  ^~~~~~~~~~~
In file included from ../py/runtime.h:29,
                 from ../py/stackctrl.c:27:
../py/mpstate.h:282:23: note: ‘mp_state_ctx’ declared here
  282 | extern mp_state_ctx_t mp_state_ctx;
      |                       ^~~~~~~~~~~~
cc1: all warnings being treated as errors
make: *** [../py/mkrules.mk:77: build/py/stackctrl.o] Error 1
```

Test failure (after downgrading build sim):

```
 File "/github/home/.cache/pypoetry/virtualenvs/hwi-crEDFiR--py3.9/lib/python3.9/site-packages/sdl2/dll.py", line 362, in <module>
    dll = DLL("SDL2", ["SDL2", "SDL2-2.0", "SDL2-2.0.0"], os.getenv("PYSDL2_DLL_PATH"))
  File "/github/home/.cache/pypoetry/virtualenvs/hwi-crEDFiR--py3.9/lib/python3.9/site-packages/sdl2/dll.py", line 253, in __init__
    raise RuntimeError("could not find any library for %s (%s)" %
RuntimeError: could not find any library for SDL2 (PYSDL2_DLL_PATH: unset)
```

https://github.com/bitcoin-core/HWI/actions/runs/16466809973/job/46548656293?pr=795
The build on ubuntu-latest succeeds, but the resulting binary uses
a too recent version of glibc for the test runners to handle.

This only seems to impact Trezor 1, but just downgrade for Trezor T
as well.
NanoS support has been dropped: LedgerHQ/app-bitcoin-new#262

NanoX also makes it possible to test MuSig2 in the future.

Keep NanoS for legacy.
@Sjors Sjors force-pushed the 2025/07/policy-sign branch 2 times, most recently from d369a27 to 479f88b Compare July 30, 2025 12:43
@Sjors Sjors force-pushed the 2025/07/policy-sign branch 3 times, most recently from 72ff9ac to af05f6a Compare July 30, 2025 18:05
@Sjors Sjors force-pushed the 2025/07/policy-sign branch from af05f6a to 31a9714 Compare July 30, 2025 18:41
@Sjors Sjors force-pushed the 2025/07/policy-sign branch from 31a9714 to dfd11e0 Compare July 30, 2025 19:02
@Sjors
Copy link
Member Author

Sjors commented Jul 31, 2025

Coldcard CI failure is probably spurious.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant