spesmilo / spesmilo/electrum

Signing PSBTs for "proof of reserves" BIP127

Open
#7,653 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
8.6k
Forks
3.5k
Avg merge
2d 8h
Merged PRs (30d)
61

Description

It would be cool, if Electrum could sign BIP127 "proof of reserves" PSBTs that were produced externally for an Electrum wallet.
Here is the story:
https://ulrichard.ch/blog/?p=2587
and
https://ulrichard.ch/blog/index.php/2021/12/10/proof-of-reserves/

Essentially, I'm trying to sign the following PSBT:
cHNidP8BANABAAAABMErBiXTxwDcvvvq771RVgP1SYJh3scx0WBImDi7rvmsAAAAAAD/////fpjOaPHeO8iuqOAAXNYTHduKraGwzE2T6uyQKv/xMiUAAAAAAP////+PIkY8icgEgelHPdjKJ5IhDDRuUpEz0MPJDo3DQjfXhwEAAAAA//////7fKpENlBvDb0Sk/pIj4asvxgJZeAl+c7QitalQiCs8AAAAAAD/////AYk6AwAAAAAAGXapFJ9/0JbTftLA4/fwz8kkvu9P/OtoiKwAAAAAAAEBCgAAAAAAAAAAAVEBBwAAAQEr2YwBAAAAAAAiACA0+1ZWhppfL2hexzK/hNEDRcsqMYpj2eygJvctc04rRiICA85usXGOxyWoB2tjhap+sMe5WMQylChyoIyPQw7YwOWYSDBFAiEAhX/LdNf2yZEB0PNIGJVIJLGp2XYnc8iZHS+0Fb8plLwCIDXlhRegpeS6T5Pvs1zBcmOAh7bpnV2UePcs3Njn+FW+AQEFR1IhA85usXGOxyWoB2tjhap+sMe5WMQylChyoIyPQw7YwOWYIQP91mGneajoVZMtGRkFWvx2ZGUYvEEA6X8IfZK8g8r8slKuIgYDzm6xcY7HJagHa2OFqn6wx7lYxDKUKHKgjI9DDtjA5ZgMXJ6u1wAAAAABAAAAIgYD/dZhp3mo6FWTLRkZBVr8dmRlGLxBAOl/CH2SvIPK/LIM9/UCiwAAAAABAAAAAAEBKxAnAAAAAAAAIgAg0akE2gMCFP1o4HslEN0ysMFhG0q2Y74tPzXhjtUSxU4iAgL6ZTC3eAZapDHPGJ2NyXB4eo7srM6X2c3zbj09qV98AUcwRAIgFHZJzHZrXUeXxxRQtiPrM0Ays6fq1Z+rIHHsQSIjOiICID5SN2tjMSlmiO7nNz3LMKRtHoLwJcv6mGU+/LhJGBTXAQEFR1IhAugJEDOoQ6+rqj7YlxPlMPumDknI/5BHw6QEDGtBVWZoIQL6ZTC3eAZapDHPGJ2NyXB4eo7srM6X2c3zbj09qV98AVKuIgYC6AkQM6hDr6uqPtiXE+Uw+6YOScj/kEfDpAQMa0FVZmgM9/UCiwAAAAAAAAAAIgYC+mUwt3gGWqQxzxidjclweHqO7KzOl9nN8249PalffAEMXJ6u1wAAAAAAAAAAAAEBK6CGAQAAAAAAIgAg++9Wlf87jJ5jDHvPj8fVofJ+/SOcaGpEaLAEJD068pIiAgK9OsDWjXhF2nZ0y1pgMJhdcAlmSzG3Bd1U40ONUA+/7EcwRAIgQGAgXVcwm2X9H5s0q9W9WUNhfwIilld+ldETrlYFx/sCIEhvT+/pE4cM0xGKJk4G7d2E/Zn5YfTtD3Ojf50qbONPAQEFR1IhAr06wNaNeEXadnTLWmAwmF1wCWZLMbcF3VTjQ41QD7/sIQNzF2pZRGQFPkASin8Ll0vqni2CK5T56jLut+XRIeq0dVKuIgYCvTrA1o14Rdp2dMtaYDCYXXAJZksxtwXdVONDjVAPv+wMXJ6u1wAAAAACAAAAIgYDcxdqWURkBT5AEop/C5dL6p4tgiuU+eoy7rfl0SHqtHUM9/UCiwAAAAACAAAAAAA=

for the following wallet:

{
    "addr_history": {
        "tb1q0v3yu6rxuvd90ur0g6hx69dhlemjdqz7fgzly8hzhwpp7kntg0dsfa0964": [],
        "tb1q36kysjh3mv6sgc5amzmysn3neqr230f0qjrfx8ersfkqhcf6z33ss04lp9": [],
        "tb1q53qxdzdxmnkuckg9lv7mk8djgq2nqkjgku5vlmg73y8an80k4f5qn9hr05": []
    },
    "addresses": {
        "change": [
            "tb1q7s26yhh8hmq2t6r8wa7ckpjhcugkhjshnw5hsg0m9u82kmmy5zrqdm2qc2",
            "tb1qewjj5nzrfj9fc73k392sr6pgeeyfvfy3vrxtczr4pyjwpzhez7eqtypafe",
            "tb1q36kysjh3mv6sgc5amzmysn3neqr230f0qjrfx8ersfkqhcf6z33ss04lp9"
        ],
        "receiving": [
            "tb1q6x5sfksrqg20668q0vj3phfjkrqkzx62ke3mutflxhsca4gjc48qgeusmx",
            "tb1qxna4v45xnf0j76z7cuetlpx3qdzuk2333f3anm9qymmj6u6w9drq4zzqm2",
            "tb1ql0h4d90l8wxfuccv008cl37458e8alfrn35x53rgkqzzg0f672fqms35mw"
        ]
    },
    "channel_backups": {},
    "fiat_value": {},
    "invoices": {},
    "labels": {},
    "payment_requests": {},
    "prevouts_by_scripthash": {},
    "seed_version": 33,
    "spent_outpoints": {},
    "transactions": {},
    "tx_fees": {},
    "txi": {},
    "txo": {},
    "use_encryption": false,
    "verified_tx3": {},
    "wallet_type": "2of2",
    "x1/": {
        "derivation": "m/1'",
        "pw_hash_version": 1,
        "root_fingerprint": "f6083804",
        "seed": "maximum assume mention girl puppy stereo river tourist gossip level panda life",
        "type": "bip32",
        "xprv": "Vprv1AEubNnoCJHpVL2TLDscvM6bEC7Q4ZxqkrdhxCHFb6EJtADGoSkb9cXt9tTFYqgEVSJGhM96eZmwK1G88SW2Zg1LayXACst8XFYSgS8dK8b",
        "xpub": "Vpub5gvwjnq3LfyVNo4FDsYDKkkhoDdLDu9kLAEVEiKZ1N2hieU3RqaBL79kL2wP5YNj2aL9Bbe5bFXm2BFbpStm5ixxo8SKQrCBK5DxSrJhq7k"
    },
    "x2/": {
        "derivation": "m/1'",
        "pw_hash_version": 1,
        "root_fingerprint": "b88448fb",
        "type": "bip32",
        "xprv": null,
        "xpub": "Vpub5gUii5ZKgrJs2sZfyHrKFrKdZqmek7iLGoX3jmREfdMscpyaDPLAcYm1mED7PexvD4JQPMJL3AGtMewxSjFhcUX64fKFR2bgLXAY7xPgJaX"
    }
}

Or even better this PSBT:
cHNidP8BANABAAAABMErBiXTxwDcvvvq771RVgP1SYJh3scx0WBImDi7rvmsAAAAAAD/////R2T53Je0wwuCC4sB4y303f5x1sXi67Sbt5GHyNJYSL8BAAAAAP////+hyKIxvTPJ++2fJ9IP+0veP366E6M3+d5ndrRywC+CdQAAAAAA/////85xD7HXF5RHqDqqrmbkuSHlVkWpGr8AQkxbX0GeWMLMAQAAAAD/////ARY4AwAAAAAAGXapFJ9/0JbTftLA4/fwz8kkvu9P/OtoiKwAAAAAAAEBCgAAAAAAAAAAAVEBBwAAAQEroIYBAAAAAAAiACA/WR3mqmBSknWlsU4tF2FirFI49AnBJ/RF3Y8MOVvj6QEFR1IhAjzWg4H+LS0DMvvpzPOBG82hnO3F2EH1ij0DfnUjXwzeIQK4J7EzNMFN5ZpMS9nZLqkSInlZWY+fv9RtNaePd/ZN7FKuIgYCPNaDgf4tLQMy++nM84EbzaGc7cXYQfWKPQN+dSNfDN4Mw7inHwAAAAADAAAAIgYCuCexMzTBTeWaTEvZ2S6pEiJ5WVmPn7/UbTWnj3f2TewMRyCUewAAAAADAAAAAAEBK2aKAQAAAAAAIgAgyuBYb4qmZ5NOo9az+sc19GSGVUza3boreImwW0wqdvMBBUdSIQIj9OEMidD0v63giswaS/zatG5LqLt/jqwauILs+Ne57CECvQAhlTCAChOhr3dosTr3S3sVmD/ogjLDtuXgi4VihPFSriIGAiP04QyJ0PS/reCKzBpL/Nq0bkuou3+OrBq4guz417nsDMO4px8AAAAAAgAAACIGAr0AIZUwgAoToa93aLE690t7FZg/6IIyw7bl4IuFYoTxDEcglHsAAAAAAgAAAAABASsQJwAAAAAAACIAIPrEeWr/BapLkLBg2LsEzljOP3I90GNzv8xyvl5bM7xEAQVHUiECSDumk7HdO7lTOGMBO/B5bxsj8qp/L2f3QJzzNL+WtsMhA++dVhrt7uwufhjJcNk1+Nh1w4ipjbjCnWzfcHwJSkSCUq4iBgJIO6aTsd07uVM4YwE78HlvGyPyqn8vZ/dAnPM0v5a2wwxHIJR7AAAAAAEAAAAiBgPvnVYa7e7sLn4YyXDZNfjYdcOIqY24wp1s33B8CUpEggzDuKcfAAAAAAEAAAAAAA==

for the wallet:

{
    "addr_history": {
        "tb1q4dhcva207vq225ljqfht0xr3ydfmcjj9mcnn9rqc322fpndehhqq9d596z": [],
        "tb1q4n590s3wlqtsz4g6jzmfc8whn0fvun3vmjzpuj5740gr56jfjy2qpglrkv": [],
        "tb1q6cdpn4d373nnkvn682s37dsyhvy3y6lksdqpuzr9k3ch72mxmhzsa8ed32": []
    },
    "addresses": {
        "change": [
            "tb1qwvcpet99frsw8v6rkuymw969uwrc9vs5dpy04ru8f45xl8s6u3kq96tt6m",
            "tb1qg2cdtu7c860qgm894l65m4drzpvhskmvsx8cr6h7c72gmmeys6aqvj8cya",
            "tb1q6cdpn4d373nnkvn682s37dsyhvy3y6lksdqpuzr9k3ch72mxmhzsa8ed32"
        ],
        "receiving": [
            "tb1q4n590s3wlqtsz4g6jzmfc8whn0fvun3vmjzpuj5740gr56jfjy2qpglrkv",
            "tb1qltz8j6hlqk4yhy9svrvtkpxwtr8r7u3a6p3h807vw2l9ukenh3zql3lyr5",
            "tb1qets9smu25enexn4r66el43e473jgv42vmtwm52mc3xc9knp2wmes48skss"
        ]
    },
    "channel_backups": {},
    "fiat_value": {},
    "invoices": {},
    "labels": {},
    "payment_requests": {},
    "prevouts_by_scripthash": {},
    "seed_version": 33,
    "spent_outpoints": {},
    "transactions": {},
    "tx_fees": {},
    "txi": {},
    "txo": {},
    "use_encryption": false,
    "verified_tx3": {},
    "wallet_type": "2of2",
    "x1/": {
        "derivation": "m/48'/1'/0'/2'",
        "hw_type": "bitbox02",
        "label": "bb2 (27d81095)",
        "root_fingerprint": "27d81095",
        "soft_device_id": "27d81095",
        "type": "hardware",
        "xpub": "Vpub5mUs4UNPA6T3VAmcTWTJ2nCV2oAEFQqBNQQDH62NQNpdAMSyL2Nd3vZXF6uQfNeiCst7asUapZWM9AKmsYCK1BjUrEVhiVm9M4qnbHvDRDe"
    },
    "x2/": {
        "derivation": "m/48'/100'/0'/2'",
        "hw_type": "trezor",
        "label": "T-Rex",
        "root_fingerprint": "6bfac2d6",
        "soft_device_id": "EE735C3D13E9A60902B42A02",
        "type": "hardware",
        "xpub": "Vpub5mTgvNLEMssnVd4fezZgnDhLefVaYCb94GsjHfgrhXksbrHRbMa2AwjWX9eczB1dG19oZmEnVNCeVLWoygXQrkL8nuyAgWDxnePWUQ5fE3N"
    }
}

Of course, it would be cool, if Electrum had full support for BIP127 proof of reserves, but being able to sign would be a good first step.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Read BIP127 and the two linked proof-of-reserves explanations, then reproduce the supplied PSBT signing request in Electrum. Trace Electrum's existing PSBT signing entry point and determine what BIP127 handling is missing. Done means externally produced BIP127 PSBTs can be signed for supported Electrum wallets, with the supplied examples serving as validation cases.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
cryptography, security
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.