mirror of
https://github.com/urbit/shrub.git
synced 2024-12-19 16:51:42 +03:00
PSBT docs; parse PSBTs
This commit is contained in:
parent
ecb40418e6
commit
1497b4127c
28
PSBT.md
28
PSBT.md
@ -13,11 +13,37 @@ bitcoin-cli -rpcuser=__cookie__ -rpcpassword=9e0ca21c70d6b7307b750c8012d12df04ef
|
|||||||
=btc -build-file %/lib/btc/hoon
|
=btc -build-file %/lib/btc/hoon
|
||||||
=psbt 'cHNidP8BAKACAAAAAqsJSaCMWvfEm4IS9Bfi8Vqz9cM9zxU4IagTn4d6W3vkAAAAAAD+////qwlJoIxa98SbghL0F+LxWrP1wz3PFTghqBOfh3pbe+QBAAAAAP7///8CYDvqCwAAAAAZdqkUdopAu9dAy+gdmI5x3ipNXHE5ax2IrI4kAAAAAAAAGXapFG9GILVT+glechue4O/p+gOcykWXiKwAAAAAAAEHakcwRAIgR1lmF5fAGwNrJZKJSGhiGDR9iYZLcZ4ff89X0eURZYcCIFMJ6r9Wqk2Ikf/REf3xM286KdqGbX+EhtdVRs7tr5MZASEDXNxh/HupccC1AaZGoqg7ECy0OIEhfKaC3Ibi1z+ogpIAAQEgAOH1BQAAAAAXqRQ1RebjO4MsRwUPJNPuuTycA5SLx4cBBBYAFIXRNTfy4mVAWjTbr6nj3aAfuCMIAAAA'
|
=psbt 'cHNidP8BAKACAAAAAqsJSaCMWvfEm4IS9Bfi8Vqz9cM9zxU4IagTn4d6W3vkAAAAAAD+////qwlJoIxa98SbghL0F+LxWrP1wz3PFTghqBOfh3pbe+QBAAAAAP7///8CYDvqCwAAAAAZdqkUdopAu9dAy+gdmI5x3ipNXHE5ax2IrI4kAAAAAAAAGXapFG9GILVT+glechue4O/p+gOcykWXiKwAAAAAAAEHakcwRAIgR1lmF5fAGwNrJZKJSGhiGDR9iYZLcZ4ff89X0eURZYcCIFMJ6r9Wqk2Ikf/REf3xM286KdqGbX+EhtdVRs7tr5MZASEDXNxh/HupccC1AaZGoqg7ECy0OIEhfKaC3Ibi1z+ogpIAAQEgAOH1BQAAAAAXqRQ1RebjO4MsRwUPJNPuuTycA5SLx4cBBBYAFIXRNTfy4mVAWjTbr6nj3aAfuCMIAAAA'
|
||||||
|
|
||||||
(get-txid:psbt:btc psbt)
|
(get-txid:^psbt:btc psbt)
|
||||||
:: gives [wid=%32 dat=0xfed6.cd1f.de4d.b4e1.3e7e.8003.17e3.7f9c.bd75.ec36.4389.670e.eff8.0da9.93c7.e560]
|
:: gives [wid=%32 dat=0xfed6.cd1f.de4d.b4e1.3e7e.8003.17e3.7f9c.bd75.ec36.4389.670e.eff8.0da9.93c7.e560]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Parse PSBT into Maps
|
||||||
|
```
|
||||||
|
=btc -build-file %/lib/btc/hoon
|
||||||
|
=psbt 'cHNidP8BAKACAAAAAqsJSaCMWvfEm4IS9Bfi8Vqz9cM9zxU4IagTn4d6W3vkAAAAAAD+////qwlJoIxa98SbghL0F+LxWrP1wz3PFTghqBOfh3pbe+QBAAAAAP7///8CYDvqCwAAAAAZdqkUdopAu9dAy+gdmI5x3ipNXHE5ax2IrI4kAAAAAAAAGXapFG9GILVT+glechue4O/p+gOcykWXiKwAAAAAAAEHakcwRAIgR1lmF5fAGwNrJZKJSGhiGDR9iYZLcZ4ff89X0eURZYcCIFMJ6r9Wqk2Ikf/REf3xM286KdqGbX+EhtdVRs7tr5MZASEDXNxh/HupccC1AaZGoqg7ECy0OIEhfKaC3Ibi1z+ogpIAAQEgAOH1BQAAAAAXqRQ1RebjO4MsRwUPJNPuuTycA5SLx4cBBBYAFIXRNTfy4mVAWjTbr6nj3aAfuCMIAAAA'
|
||||||
|
|
||||||
|
(parse:^psbt:btc psbt)
|
||||||
|
```
|
||||||
|
|
||||||
## Making Derivation Paths
|
## Making Derivation Paths
|
||||||
Below is hex for `m/84'/0'/0'/0/0`
|
Below is hex for `m/84'/0'/0'/0/0`
|
||||||
`*80 is the ending for hardened paths*
|
`*80 is the ending for hardened paths*
|
||||||
54.00.00.80 00.00.00.80 00.00.00.80 00.00.00.00 00.00.00.00.00`
|
54.00.00.80 00.00.00.80 00.00.00.80 00.00.00.00 00.00.00.00.00`
|
||||||
|
|
||||||
|
## ColdCard PSBT Export Structure
|
||||||
|
If we don't have the master fingerprint, can probably fake it. It's not "load-bearing".
|
||||||
|
|
||||||
|
Maps:
|
||||||
|
1. 1 keyval
|
||||||
|
- Raw tx hex
|
||||||
|
2. 3 keyvals (Input)
|
||||||
|
- Witness TX: {8byte amount}|{1 byte scriptpubkeylen}|{22byte scriptpubkey)}
|
||||||
|
- Non Witness TX: 82 byte input tx
|
||||||
|
- Wallet Derivation path.
|
||||||
|
* Key: {0x6}|{33byte pubkey}
|
||||||
|
* Val: {4byte master xpub fingerprint}|{17byte HD path}
|
||||||
|
3. skips the main output for some reason, even though it's in raw tx hex
|
||||||
|
4. 1 keyval
|
||||||
|
- Change output Wallet derivation path
|
||||||
|
* Key: {0x2}|{33byte pubkey}
|
||||||
|
* Val: {4byte master xpub fingerprint}|{17byte HD path}
|
||||||
|
33
lib/btc.hoon
33
lib/btc.hoon
@ -70,13 +70,20 @@
|
|||||||
|%
|
|%
|
||||||
++ parse
|
++ parse
|
||||||
|= psbt-base64=cord
|
|= psbt-base64=cord
|
||||||
^- (list (list keyval:^psbt))
|
^- (list map:^psbt)
|
||||||
~[~]
|
=/ todo=^buffer
|
||||||
:: TODO:
|
%+ slag 5 (to-buffer psbt-base64)
|
||||||
:: - get into a buffer
|
=| acc=(list map:^psbt)
|
||||||
:: loop through using next-pair
|
=| m=map:^psbt
|
||||||
:: every time there's a separator, close the prior on
|
|-
|
||||||
:: +txid: extract txid from a valid PSBT
|
?~ todo (snoc acc m)
|
||||||
|
:: 0x0: map separator
|
||||||
|
?: =(0x0 i.todo)
|
||||||
|
$(acc (snoc acc m), m *map:^psbt, todo t.todo)
|
||||||
|
=+ [kv rest]=(next-keyval todo)
|
||||||
|
$(m (snoc m kv), todo rest)
|
||||||
|
:: +get-txid: extract txid from a valid PSBT
|
||||||
|
::
|
||||||
++ get-txid
|
++ get-txid
|
||||||
|= psbt-base64=cord
|
|= psbt-base64=cord
|
||||||
^- txid
|
^- txid
|
||||||
@ -100,14 +107,14 @@
|
|||||||
|- ^- btc-byts
|
|- ^- btc-byts
|
||||||
?~ b !!
|
?~ b !!
|
||||||
?: =(0x0 i.b) !!
|
?: =(0x0 i.b) !!
|
||||||
=+ np=(next-pair b)
|
=+ nk=(next-keyval b)
|
||||||
?: =(0x0 dat.key.kv.np)
|
?: =(0x0 dat.key.kv.nk)
|
||||||
val.kv.np
|
val.kv.nk
|
||||||
$(b rest.np)
|
$(b rest.nk)
|
||||||
:: +next-pair: returns next key-val in a PSBT map
|
:: +next-keyval: returns next key-val in a PSBT map
|
||||||
:: input buffer head must be a map key length
|
:: input buffer head must be a map key length
|
||||||
::
|
::
|
||||||
++ next-pair
|
++ next-keyval
|
||||||
|= b=^buffer
|
|= b=^buffer
|
||||||
^- [kv=keyval:^psbt rest=^buffer]
|
^- [kv=keyval:^psbt rest=^buffer]
|
||||||
=+ klen=(snag 0 b)
|
=+ klen=(snag 0 b)
|
||||||
|
@ -56,6 +56,7 @@
|
|||||||
++ psbt
|
++ psbt
|
||||||
|%
|
|%
|
||||||
+$ keyval [key=btc-byts val=btc-byts]
|
+$ keyval [key=btc-byts val=btc-byts]
|
||||||
|
+$ map (list keyval)
|
||||||
--
|
--
|
||||||
++ ops
|
++ ops
|
||||||
|%
|
|%
|
||||||
|
Loading…
Reference in New Issue
Block a user