mirror of
https://github.com/ilyakooo0/urbit.git
synced 2024-12-14 08:34:25 +03:00
address derivation for BIP84 works
This commit is contained in:
parent
66f59fab83
commit
84cca6d26f
@ -23,10 +23,6 @@ abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon
|
|||||||
```
|
```
|
||||||
=b -build-file %/lib/btc-scratch/hoon
|
=b -build-file %/lib/btc-scratch/hoon
|
||||||
=xpub "zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs"
|
=xpub "zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs"
|
||||||
```
|
|
||||||
|
|
||||||
### Getting BIP84 Address from `xpub`
|
|
||||||
```
|
|
||||||
(~(address bip84:b %main xpub))
|
(~(address bip84:b %main xpub))
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -188,13 +184,12 @@ Using [BIP 143](https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki#P
|
|||||||
Native P2WPKH
|
Native P2WPKH
|
||||||
```
|
```
|
||||||
=btc -build-file %/lib/btc/hoon
|
=btc -build-file %/lib/btc/hoon
|
||||||
=btcs -build-file %/sur/btc/hoon
|
=input0 (input:tx:btc [[32 0xfff7.f788.1a80.99af.a694.0d42.d1e7.f636.2bec.3817.1ea3.edf4.3354.1db4.e4ad.969f] 0 0 [4 0xeeff.ffff] [35 0x21.03c9.f483.6b9a.4f77.fc0d.81f7.bcb0.1b7f.1b35.9168.64b9.476c.241c.e9fc.198b.d254.32ac] ~ ~ 625.000.000])
|
||||||
=input0 (input:tx:btcs [[32 0xfff7.f788.1a80.99af.a694.0d42.d1e7.f636.2bec.3817.1ea3.edf4.3354.1db4.e4ad.969f] 0 0 [4 0xeeff.ffff] [35 0x21.03c9.f483.6b9a.4f77.fc0d.81f7.bcb0.1b7f.1b35.9168.64b9.476c.241c.e9fc.198b.d254.32ac] ~ ~ 625.000.000])
|
=input1 (input:tx:btc[[32 0xef51.e1b8.04cc.89d1.82d2.7965.5c3a.a89e.815b.1b30.9fe2.87d9.b2b5.5d57.b90e.c68a] 0 1 [4 0xffff.ffff] [22 0x14.1d0f.172a.0ecb.48ae.e1be.1f26.87d2.963a.e33f.71a1] ~ `[33 0x2.5476.c2e8.3188.368d.a1ff.3e29.2e7a.cafc.db35.66bb.0ad2.53f6.2fc7.0f07.aeee.6357] 600.000.000])
|
||||||
=input1 (input:tx:btcs [[32 0xef51.e1b8.04cc.89d1.82d2.7965.5c3a.a89e.815b.1b30.9fe2.87d9.b2b5.5d57.b90e.c68a] 0 1 [4 0xffff.ffff] [22 0x14.1d0f.172a.0ecb.48ae.e1be.1f26.87d2.963a.e33f.71a1] ~ `[33 0x2.5476.c2e8.3188.368d.a1ff.3e29.2e7a.cafc.db35.66bb.0ad2.53f6.2fc7.0f07.aeee.6357] 600.000.000])
|
|
||||||
|
|
||||||
=output0 (output:tx:btcs [[%bech32 'bc1qs2qtxl0n0rdenan0shy457p6w6k85m2e36f7ze'] 112.340.000])
|
=output0 (output:tx:btc [[%bech32 'bc1qs2qtxl0n0rdenan0shy457p6w6k85m2e36f7ze'] 112.340.000])
|
||||||
=output1 (output:tx:btcs [[%bech32 'bc1q800y9klw0exmu63pkt2sechszel64q2enddkt4'] 223.450.000])
|
=output1 (output:tx:btc [[%bech32 'bc1q800y9klw0exmu63pkt2sechszel64q2enddkt4'] 223.450.000])
|
||||||
=utx (unsigned:tx:btcs [1 0x11 ~[input0 input1] ~[output0 output1]])
|
=utx (unsigned:tx:btc [1 0x11 ~[input0 input1] ~[output0 output1]])
|
||||||
|
|
||||||
(~(sighash unsigned-tx:btc utx) 1)
|
(~(sighash unsigned-tx:btc utx) 1)
|
||||||
:: gives [wid=32 dat=0xc37a.f311.16d1.b27c.af68.aae9.e3ac.82f1.4779.2901.4d5b.9176.57d0.eb49.478c.b670]
|
:: gives [wid=32 dat=0xc37a.f311.16d1.b27c.af68.aae9.e3ac.82f1.4779.2901.4d5b.9176.57d0.eb49.478c.b670]
|
||||||
@ -230,9 +225,9 @@ Signing input index 0 (non-witness)
|
|||||||
|
|
||||||
### A sample legacy address-only transaction
|
### A sample legacy address-only transaction
|
||||||
```
|
```
|
||||||
=linput0 (input:tx:btcs [[32 0xeccf.7e30.3418.9b85.1985.d871.f913.84b8.ee35.7cd4.7c30.2473.6e56.76eb.2deb.b3f2] 1 0 [4 0xffff.ffff] [25 0x76.a914.0109.6677.6006.953d.5567.439e.5e39.f86a.0d27.3bee.88ac] ~ ~ 100.000.000])
|
=linput0 (input:tx:btc [[32 0xeccf.7e30.3418.9b85.1985.d871.f913.84b8.ee35.7cd4.7c30.2473.6e56.76eb.2deb.b3f2] 1 0 [4 0xffff.ffff] [25 0x76.a914.0109.6677.6006.953d.5567.439e.5e39.f86a.0d27.3bee.88ac] ~ ~ 100.000.000])
|
||||||
=loutput0 (output:tx:btcs [[%legacy 0c1runeksijzfVxyrpiyCY2LCBvYsSiFsCm] 99.900.000])
|
=loutput0 (output:tx:btc [[%legacy 0c1runeksijzfVxyrpiyCY2LCBvYsSiFsCm] 99.900.000])
|
||||||
=lutx (unsigned:tx:btcs [1 0x0 ~[linput0] ~[loutput0]])
|
=lutx (unsigned:tx:btc [1 0x0 ~[linput0] ~[loutput0]])
|
||||||
|
|
||||||
=lh dat:(~(sighash unsigned-tx:btc lutx) 0)
|
=lh dat:(~(sighash unsigned-tx:btc lutx) 0)
|
||||||
=lprivkey 0x18e1.4a7b.6a30.7f42.6a94.f811.4701.e7c8.e774.e7f9.a47e.2c20.35db.29a2.0632.1725
|
=lprivkey 0x18e1.4a7b.6a30.7f42.6a94.f811.4701.e7c8.e774.e7f9.a47e.2c20.35db.29a2.0632.1725
|
70
WALLET.scratch.md
Normal file
70
WALLET.scratch.md
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
# btc-wallet-* Scratch Code
|
||||||
|
|
||||||
|
## xpub
|
||||||
|
```
|
||||||
|
=xpub1 "zpub6r8dKyWJ31XF6n69KKeEwLjVC5ruqAbiJ4QCqLsrV36Mvx9WEjUaiPNPGFLHNCCqgCdy6iZC8ZgHsm6a1AUTVBMVbKGemNcWFcwBGSjJKbD"
|
||||||
|
=xpub2 "xpub6D7yaZieZEeG617UcKXDhbsDeso6bmxSAiGWkvkASoiwcjaRtrH5HeNRnDT25s7zmxYzj6MtFe32dVqcf9YcBKKgn9THHjwn2uSjkvobK4e"
|
||||||
|
=bl -build-file %/lib/btc-wallet-store/hoon
|
||||||
|
```
|
||||||
|
|
||||||
|
### add
|
||||||
|
```
|
||||||
|
:btc-wallet-store|action [%add-wallet xpub ~ ~]
|
||||||
|
```
|
||||||
|
|
||||||
|
### get address at indices
|
||||||
|
```
|
||||||
|
=walt1 (from-xpub:walt:bl xpub1 ~ ~)
|
||||||
|
=walt2 (from-xpub:walt:bl xpub2 ~ ~)
|
||||||
|
(get-address:walt1 %0 0)
|
||||||
|
(get-address:walt2 %0 0)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## scratch code, refactor
|
||||||
|
++ update-address
|
||||||
|
|= [a=address:btc us=(set utxo)]
|
||||||
|
^- (quip card _state)
|
||||||
|
=/ xpubs=(list tape)
|
||||||
|
%~ tap in
|
||||||
|
~(key by walts.state)
|
||||||
|
|- ?~ xpubs `state
|
||||||
|
=/ w=walt (~(got by walts.state) i.xpubs)
|
||||||
|
?: (~(has by wach.w) a)
|
||||||
|
%: send-address-update
|
||||||
|
i.xpubs
|
||||||
|
(update-wallet w a us)
|
||||||
|
a
|
||||||
|
us
|
||||||
|
==
|
||||||
|
$(xpubs t.xpubs)
|
||||||
|
::
|
||||||
|
++ update-wallet
|
||||||
|
|= [w=walt a=address:btc us=(set utxo)]
|
||||||
|
^- walt
|
||||||
|
=/ curr-addi=addi
|
||||||
|
(~(got by wach.w) a)
|
||||||
|
w(wach (~(put by wach.w) a curr-addi(used %.y, utxos us)))
|
||||||
|
::
|
||||||
|
++ send-address-update
|
||||||
|
|= [xpub=tape =walt a=address:btc us=(set utxo)]
|
||||||
|
^- (quip card _state)
|
||||||
|
:_ state(walts (~(put by walts.state) xpub walt))
|
||||||
|
~[[%give %fact ~[/wallets] %btc-wallet-store-update !>([%address a us])]]
|
||||||
|
::
|
||||||
|
++ add-wallet
|
||||||
|
|= [xpub=tape scan-to=(unit scon) max-gap=(unit @)]
|
||||||
|
^- (quip card _state)
|
||||||
|
?: (~(has by walts.state) xpub)
|
||||||
|
~& >>> "xpub already imported"
|
||||||
|
`state
|
||||||
|
=/ wallet=walt
|
||||||
|
:* (from-extended:bip32 xpub)
|
||||||
|
(xpub-type:btc xpub)
|
||||||
|
*wach
|
||||||
|
[0 0]
|
||||||
|
%.n
|
||||||
|
(fall scan-to *scon)
|
||||||
|
(fall max-gap max-gap.state)
|
||||||
|
==
|
||||||
|
`state(walts (~(put by walts.state) xpub wallet))
|
@ -6,7 +6,7 @@
|
|||||||
:: watched address updates
|
:: watched address updates
|
||||||
::
|
::
|
||||||
/- *btc-wallet-store
|
/- *btc-wallet-store
|
||||||
/+ dbug, default-agent, bip32, btc
|
/+ dbug, default-agent, *btc-wallet-store, btc, bip32
|
||||||
|%
|
|%
|
||||||
+$ versioned-state
|
+$ versioned-state
|
||||||
$% state-0
|
$% state-0
|
||||||
@ -73,55 +73,11 @@
|
|||||||
^- (quip card _state)
|
^- (quip card _state)
|
||||||
?- -.act
|
?- -.act
|
||||||
%add-wallet
|
%add-wallet
|
||||||
(add-wallet +.act)
|
`state
|
||||||
|
:: (add-wallet +.act)
|
||||||
::
|
::
|
||||||
%update-address
|
%update-address
|
||||||
(update-address +.act)
|
|
||||||
==
|
|
||||||
++ update-address
|
|
||||||
|= [a=address us=(set utxo)]
|
|
||||||
^- (quip card _state)
|
|
||||||
=/ xpubs=(list tape)
|
|
||||||
%~ tap in
|
|
||||||
~(key by walts.state)
|
|
||||||
|- ?~ xpubs `state
|
|
||||||
=/ w=walt (~(got by walts.state) i.xpubs)
|
|
||||||
?: (~(has by wach.w) a)
|
|
||||||
%: send-address-update
|
|
||||||
i.xpubs
|
|
||||||
(update-wallet w a us)
|
|
||||||
a
|
|
||||||
us
|
|
||||||
==
|
|
||||||
$(xpubs t.xpubs)
|
|
||||||
::
|
|
||||||
++ update-wallet
|
|
||||||
|= [w=walt a=address us=(set utxo)]
|
|
||||||
^- walt
|
|
||||||
=/ curr-addi=addi
|
|
||||||
(~(got by wach.w) a)
|
|
||||||
w(wach (~(put by wach.w) a curr-addi(used %.y, utxos us)))
|
|
||||||
::
|
|
||||||
++ send-address-update
|
|
||||||
|= [xpub=tape =walt a=address us=(set utxo)]
|
|
||||||
^- (quip card _state)
|
|
||||||
:_ state(walts (~(put by walts.state) xpub walt))
|
|
||||||
~[[%give %fact ~[/wallets] %btc-wallet-store-update !>([%address a us])]]
|
|
||||||
::
|
|
||||||
++ add-wallet
|
|
||||||
|= [xpub=tape scan-to=(unit scon) max-gap=(unit @)]
|
|
||||||
^- (quip card _state)
|
|
||||||
?: (~(has by walts.state) xpub)
|
|
||||||
~& >>> "xpub already imported"
|
|
||||||
`state
|
`state
|
||||||
=/ wallet=walt
|
:: (update-address +.act)
|
||||||
:* (from-extended:bip32 xpub)
|
==
|
||||||
(xpub-type:btc xpub)
|
|
||||||
*wach
|
|
||||||
[0 0]
|
|
||||||
%.n
|
|
||||||
(fall scan-to *scon)
|
|
||||||
(fall max-gap max-gap.state)
|
|
||||||
==
|
|
||||||
`state(walts (~(put by walts.state) xpub wallet))
|
|
||||||
--
|
--
|
||||||
|
42
lib/btc-wallet-store.hoon
Normal file
42
lib/btc-wallet-store.hoon
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/- *btc-wallet-store
|
||||||
|
/+ bip32, btc
|
||||||
|
=, secp:crypto
|
||||||
|
=+ ecc=secp256k1
|
||||||
|
|%
|
||||||
|
++ default-max-gap 20
|
||||||
|
:: xpub
|
||||||
|
:: wilt
|
||||||
|
:: bipt: BIP44/49/84
|
||||||
|
:: wach
|
||||||
|
:: next: next index to generate address for in non-change/change accounts respectively
|
||||||
|
:: scanned: whether the wallet's addresses have been checked for prior activity
|
||||||
|
:: if unscanned, 'next' values won't be valid
|
||||||
|
:: scan-to
|
||||||
|
:: max-gap
|
||||||
|
::
|
||||||
|
++ walt
|
||||||
|
|_ [=wilt =bipt =wach next=idxs scanned=? scan-to=scon max-gap=@u]
|
||||||
|
++ from-xpub
|
||||||
|
|= [xpub=tape scan-to=(unit scon) max-gap=(unit @u)]
|
||||||
|
%= +>
|
||||||
|
wilt (from-extended:bip32 xpub)
|
||||||
|
bipt (xpub-type:btc xpub)
|
||||||
|
wach *^wach
|
||||||
|
next [0 0]
|
||||||
|
scanned %.n
|
||||||
|
scan-to (fall scan-to *scon)
|
||||||
|
max-gap (fall max-gap default-max-gap)
|
||||||
|
==
|
||||||
|
++ get-address
|
||||||
|
|= [=chyg idx=@]
|
||||||
|
^- address:btc
|
||||||
|
=/ pubkey=@ux
|
||||||
|
%- compress-point:ecc
|
||||||
|
pub:(derive-public:(derive-public:wilt (@u chyg)) idx)
|
||||||
|
~& > pubkey
|
||||||
|
?: ?=(%bip84 bipt)
|
||||||
|
(need (encode-pubkey:bech32:btc %main pubkey))
|
||||||
|
:: [%legacy (@uc pubkey)]
|
||||||
|
~|("legacy addresses not supported yet" !!)
|
||||||
|
--
|
||||||
|
--
|
@ -1,4 +1,7 @@
|
|||||||
/- *btc
|
/- sur=btc
|
||||||
|
^?
|
||||||
|
=< [sur .]
|
||||||
|
=, sur
|
||||||
|%
|
|%
|
||||||
++ xpub-type
|
++ xpub-type
|
||||||
|= xpub=tape
|
|= xpub=tape
|
||||||
@ -264,6 +267,7 @@
|
|||||||
(my [[%main "bc"] [%testnet "tb"] ~])
|
(my [[%main "bc"] [%testnet "tb"] ~])
|
||||||
++ charset "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
|
++ charset "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
|
||||||
+$ raw-decoded [hrp=tape data=(list @) checksum=(list @)]
|
+$ raw-decoded [hrp=tape data=(list @) checksum=(list @)]
|
||||||
|
:: below is a port of: https://github.com/bitcoinjs/bech32/blob/master/index.js
|
||||||
::
|
::
|
||||||
++ polymod
|
++ polymod
|
||||||
|= values=(list @)
|
|= values=(list @)
|
||||||
|
@ -5,39 +5,27 @@
|
|||||||
/- *btc
|
/- *btc
|
||||||
/+ bip32
|
/+ bip32
|
||||||
|%
|
|%
|
||||||
:: chyg: stores the state of a change/non-change path
|
++ max-index (dec (pow 2 32))
|
||||||
|
:: chyg: whether account is non-change/change
|
||||||
|
:: idxs: pair of indices (non-change/change)
|
||||||
:: addi: address with metadata inside a change path
|
:: addi: address with metadata inside a change path
|
||||||
:: wach: map for watched addresses
|
:: wach: map for watched addresses
|
||||||
:: scon: indices to initially scan to in non-change/change accounts respectively
|
:: scon: indices to initially scan to in non-change/change accounts respectively
|
||||||
:: defaults to 2^32-1 (i.e. all the addresses)
|
:: defaults to 2^32-1 (i.e. all the addresses, ~4B)
|
||||||
:: wilt: stores xpub; copulates with thousands of indices to form addresses
|
:: wilt: stores xpub; copulates with thousands of indices to form addresses
|
||||||
:: walt: wallet metadata
|
:: walt: wallet metadata
|
||||||
::
|
::
|
||||||
+$ chyg $?(%0 %1)
|
+$ chyg $?(%0 %1)
|
||||||
+$ addi [=chyg idx=@ used=? utxos=(set utxo)]
|
+$ idxs (pair @u @u)
|
||||||
|
+$ addi [=chyg idx=@u used=? utxos=(set utxo)]
|
||||||
+$ wach (map address addi)
|
+$ wach (map address addi)
|
||||||
++ max-index (dec (pow 2 32))
|
+$ scon $~([max-index max-index] idxs)
|
||||||
+$ scon $~([max-index max-index] (pair @ @))
|
|
||||||
+$ wilt _bip32
|
+$ wilt _bip32
|
||||||
+$ walt
|
+$ action
|
||||||
$: :: bipt: BIP44/49/84
|
$% [%add-wallet xpub=tape scan-to=(unit scon) max-gap=(unit @u)]
|
||||||
:: next: next index to generate address for in non-change/change accounts respectively
|
[%update-address a=address utxos=(set utxo)]
|
||||||
:: scanned: whether the wallet's addresses have been checked for prior activity
|
|
||||||
:: if unscanned, 'next' values won't be valid
|
|
||||||
::
|
|
||||||
=wilt
|
|
||||||
=bipt
|
|
||||||
=wach
|
|
||||||
next=(pair @ @)
|
|
||||||
scanned=?
|
|
||||||
scan-to=scon
|
|
||||||
max-gap=@
|
|
||||||
==
|
|
||||||
+$ action
|
|
||||||
$% [%add-wallet xpub=tape scan-to=(unit scon) max-gap=(unit @)]
|
|
||||||
[%update-address =address utxos=(set utxo)]
|
|
||||||
==
|
==
|
||||||
+$ update
|
+$ update
|
||||||
$% [%address =address utxos=(set utxo)]
|
$% [%address a=address utxos=(set utxo)]
|
||||||
==
|
==
|
||||||
--
|
--
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
+$ bech32-address $%([%bech32 cord])
|
+$ bech32-address $%([%bech32 cord])
|
||||||
+$ address ?(legacy-address bech32-address)
|
+$ address ?(legacy-address bech32-address)
|
||||||
+$ bipt $?(%bip44 %bip49 %bip84)
|
+$ bipt $?(%bip44 %bip49 %bip84)
|
||||||
+$ sats @ud ::
|
+$ sats @ud
|
||||||
+$ hash256 [wid=%32 dat=@ux]
|
+$ hash256 [wid=%32 dat=@ux]
|
||||||
+$ hash160 [wid=%20 dat=@ux]
|
+$ hash160 [wid=%20 dat=@ux]
|
||||||
+$ hash ?(hash256 hash160)
|
+$ hash ?(hash256 hash160)
|
||||||
|
Loading…
Reference in New Issue
Block a user