mirror of
https://github.com/urbit/shrub.git
synced 2024-12-25 21:12:56 +03:00
BTC signing removed; type changes
This commit is contained in:
parent
3a98672127
commit
d4b25cc5f3
49
MOON_INSTALL.md
Normal file
49
MOON_INSTALL.md
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
# Installing on a Moon
|
||||||
|
Requires base hash at least: `rd3oe`
|
||||||
|
|
||||||
|
## Create Moon
|
||||||
|
In your Urbit:
|
||||||
|
```
|
||||||
|
|moon
|
||||||
|
```
|
||||||
|
Copy the key and note the moon name.
|
||||||
|
|
||||||
|
## Install New `zuse.hoon`
|
||||||
|
```
|
||||||
|
./urbit -w $MOON_NAME -G $COPIED_KEY
|
||||||
|
```
|
||||||
|
The moon will compile and apply OTAs. After that is done, run:
|
||||||
|
```
|
||||||
|
|mount %
|
||||||
|
```
|
||||||
|
|
||||||
|
Back outside:
|
||||||
|
```
|
||||||
|
cd $BTC_AGENTS_DIR
|
||||||
|
./install-zuse.sh $MOON_PIER
|
||||||
|
```
|
||||||
|
|
||||||
|
In moon:
|
||||||
|
```
|
||||||
|
|commit %home
|
||||||
|
|reset
|
||||||
|
```
|
||||||
|
|
||||||
|
Install the rest of the files:
|
||||||
|
```
|
||||||
|
./install.sh $MOON_PIER
|
||||||
|
```
|
||||||
|
|
||||||
|
The kernel will recompile. Then test that the new `decompress-point` is included.
|
||||||
|
The below should yield: `0x3.30d5.4fd0.dd42.0a6e.5f8d.3624.f5f3.482c.ae35.0f79.d5f0.753b.f5be.ef9c.2d91.af3c`
|
||||||
|
```
|
||||||
|
=bip32 -build-file %/lib/bip32/hoon
|
||||||
|
=ecc secp256k1:secp:crypto
|
||||||
|
=xpub "zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs"
|
||||||
|
`@ux`(compress-point:ecc pub:(derive-public:(derive-public:(from-extended:bip32 xpub) 0) 0))
|
||||||
|
```
|
||||||
|
|
||||||
|
## Start `btc-provider`
|
||||||
|
```
|
||||||
|
:btc-provider|command [%set-credentials api-url='http://localhost:50002']
|
||||||
|
```
|
@ -24,7 +24,7 @@
|
|||||||
==
|
==
|
||||||
:: provider: maybe ship if provider is set
|
:: provider: maybe ship if provider is set
|
||||||
:: moon-limit: how many addresses a ship and its moons can request in piym
|
:: moon-limit: how many addresses a ship and its moons can request in piym
|
||||||
:: feybs: fee/byte in sats for a given ship payee
|
:: feybs: fee/byte in sats used for a given ship payee
|
||||||
:: piym/poym-watch: listen to btc-wallet-store for address updates; update payment info
|
:: piym/poym-watch: listen to btc-wallet-store for address updates; update payment info
|
||||||
::
|
::
|
||||||
+$ state-0
|
+$ state-0
|
||||||
@ -34,13 +34,12 @@
|
|||||||
def-wallet=(unit xpub)
|
def-wallet=(unit xpub)
|
||||||
moon-limit=@ud
|
moon-limit=@ud
|
||||||
feybs=(map ship sats)
|
feybs=(map ship sats)
|
||||||
=pend-addr
|
=reqs
|
||||||
=piym
|
=piym
|
||||||
poym=(unit txbu:bws)
|
poym=(unit txbu:bws)
|
||||||
=piym-watch
|
|
||||||
=poym-watch
|
|
||||||
==
|
==
|
||||||
::
|
::
|
||||||
|
:: TODO: find all instances of scan-addr -- make them typed correctly
|
||||||
+$ card card:agent:gall
|
+$ card card:agent:gall
|
||||||
--
|
--
|
||||||
=| state-0
|
=| state-0
|
||||||
@ -178,7 +177,7 @@
|
|||||||
`state(poym ~)
|
`state(poym ~)
|
||||||
::
|
::
|
||||||
%force-retry
|
%force-retry
|
||||||
[retry-pend-addr state]
|
[retry-scan-addr state]
|
||||||
==
|
==
|
||||||
:: +handle-provider-status: handle connectivity updates from provider
|
:: +handle-provider-status: handle connectivity updates from provider
|
||||||
:: if status is %connected, retry all pending address lookups
|
:: if status is %connected, retry all pending address lookups
|
||||||
@ -192,7 +191,7 @@
|
|||||||
?- -.s
|
?- -.s
|
||||||
%connected
|
%connected
|
||||||
:- ?: connected.u.provider ~
|
:- ?: connected.u.provider ~
|
||||||
(weld retry-pend-addr retry-txbu)
|
(weld retry-scan-addr retry-txbu)
|
||||||
%= state
|
%= state
|
||||||
provider `[host.u.provider %.y]
|
provider `[host.u.provider %.y]
|
||||||
btc-state [blockcount.s fee.s now.bowl]
|
btc-state [blockcount.s fee.s now.bowl]
|
||||||
@ -207,9 +206,9 @@
|
|||||||
?. ?=(%.y -.upd) `state
|
?. ?=(%.y -.upd) `state
|
||||||
?- -.body.p.upd
|
?- -.body.p.upd
|
||||||
%address-info
|
%address-info
|
||||||
=+ req=(~(get by pend-addr) req-id.p.upd)
|
=+ req=(~(get by scan-addr) req-id.p.upd)
|
||||||
?~ req `state
|
?~ req `state
|
||||||
:_ state(pend-addr (~(del by pend-addr) req-id.p.upd))
|
:_ state(scan-addr (~(del by scan-addr) req-id.p.upd))
|
||||||
:~ %- poke-wallet-store
|
:~ %- poke-wallet-store
|
||||||
:* %address-info xpub.u.req chyg.u.req idx.u.req
|
:* %address-info xpub.u.req chyg.u.req idx.u.req
|
||||||
utxos.body.p.upd used.body.p.upd blockcount.body.p.upd
|
utxos.body.p.upd used.body.p.upd blockcount.body.p.upd
|
||||||
@ -229,7 +228,7 @@
|
|||||||
?- -.req
|
?- -.req
|
||||||
%scan-address
|
%scan-address
|
||||||
=+ ri=(gen-req-id:bp eny.bowl)
|
=+ ri=(gen-req-id:bp eny.bowl)
|
||||||
:_ state(pend-addr (~(put by pend-addr) ri req))
|
:_ state(scan-addr (~(put by scan-addr) ri req))
|
||||||
?~ provider ~
|
?~ provider ~
|
||||||
?: provider-connected
|
?: provider-connected
|
||||||
~[(get-address-info ri host.u.provider a.req)]
|
~[(get-address-info ri host.u.provider a.req)]
|
||||||
@ -305,10 +304,10 @@
|
|||||||
%+ levy txis.u.poym
|
%+ levy txis.u.poym
|
||||||
|=(t=txi:bws ?=(^ ur.t))
|
|=(t=txi:bws ?=(^ ur.t))
|
||||||
::
|
::
|
||||||
++ retry-pend-addr
|
++ retry-scan-addr
|
||||||
^- (list card)
|
^- (list card)
|
||||||
?~ provider ~|("provider not set" !!)
|
?~ provider ~|("provider not set" !!)
|
||||||
%+ turn ~(tap by pend-addr)
|
%+ turn ~(tap by scan-addr)
|
||||||
|= [ri=req-id:bp req=request:bws]
|
|= [ri=req-id:bp req=request:bws]
|
||||||
(get-address-info ri host.u.provider a.req)
|
(get-address-info ri host.u.provider a.req)
|
||||||
::
|
::
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
==
|
==
|
||||||
:: walts: all wallets, keyed by their xpubs
|
:: walts: all wallets, keyed by their xpubs
|
||||||
:: scans: batch info for wallets being scanned
|
:: scans: batch info for wallets being scanned
|
||||||
|
:: gena: generated addresses that haven't had activity yet
|
||||||
:: batch-size: how many addresses to send out at once for checking
|
:: batch-size: how many addresses to send out at once for checking
|
||||||
:: last-block: most recent block seen by the store
|
:: last-block: most recent block seen by the store
|
||||||
::
|
::
|
||||||
@ -26,6 +27,7 @@
|
|||||||
$: %0
|
$: %0
|
||||||
walts=(map xpub:btc walt)
|
walts=(map xpub:btc walt)
|
||||||
=scans
|
=scans
|
||||||
|
=gena
|
||||||
batch-size=@ud
|
batch-size=@ud
|
||||||
last-block=@ud
|
last-block=@ud
|
||||||
==
|
==
|
||||||
|
128
lib/btc.hoon
128
lib/btc.hoon
@ -85,134 +85,6 @@
|
|||||||
|= bs=(list ^buffer) ^- byts
|
|= bs=(list ^buffer) ^- byts
|
||||||
%- to-byts (zing bs)
|
%- to-byts (zing bs)
|
||||||
--
|
--
|
||||||
::
|
|
||||||
:: TODO: current status
|
|
||||||
:: - creates sighash for witness correctly
|
|
||||||
:: - creates sighash for 1-input legacy correctly
|
|
||||||
:: - don't know yet whether the sighash for multiple-input legacy is correct -- test w JS
|
|
||||||
::
|
|
||||||
++ unsigned-tx
|
|
||||||
=, buffer
|
|
||||||
|_ ut=unsigned:tx
|
|
||||||
++ sequence-buffer
|
|
||||||
|= =input:tx ^- ^buffer
|
|
||||||
(from-byts sequence.input)
|
|
||||||
::
|
|
||||||
++ outputs-buffer
|
|
||||||
|= =output:tx ^- ^buffer
|
|
||||||
%+ weld
|
|
||||||
(from-atom-le 8 value.output)
|
|
||||||
(address-to-script-pubkey address.output)
|
|
||||||
::
|
|
||||||
++ sighash
|
|
||||||
|= input-index=@ ^- hash256
|
|
||||||
?: (gte input-index (lent inputs.ut))
|
|
||||||
~|("Input index out of range" !!)
|
|
||||||
=/ =input:tx (snag input-index inputs.ut)
|
|
||||||
?: =(1 witness-ver.input)
|
|
||||||
(sighash-witness input)
|
|
||||||
(sighash-legacy input-index)
|
|
||||||
::
|
|
||||||
++ sighash-witness
|
|
||||||
|= =input:tx
|
|
||||||
|^ ^- hash256
|
|
||||||
=/ prevouts=byts
|
|
||||||
%- concat-as-byts (turn inputs.ut prevouts-buffer)
|
|
||||||
=/ sequences=byts
|
|
||||||
%- concat-as-byts (turn inputs.ut sequence-buffer)
|
|
||||||
=/ outputs=byts
|
|
||||||
%- concat-as-byts (turn outputs.ut outputs-buffer)
|
|
||||||
:: Hash inputs in order, as per BIP143 examples
|
|
||||||
::
|
|
||||||
=/ n-version=^buffer (from-atom-le 4 version.ut)
|
|
||||||
=/ hash-prevouts=^buffer
|
|
||||||
%- from-byts (dsha256 prevouts)
|
|
||||||
=/ hash-sequence=^buffer
|
|
||||||
%- from-byts (dsha256 sequences)
|
|
||||||
=/ outpoint=^buffer
|
|
||||||
%+ weld (from-byts txid.input)
|
|
||||||
(from-atom-le 4 witness-ver.input)
|
|
||||||
=/ script-code=^buffer
|
|
||||||
%- to-script-pubkey
|
|
||||||
(slag 2 (from-byts script-pubkey.input))
|
|
||||||
=/ amount=^buffer
|
|
||||||
(from-atom-le 8 value.input)
|
|
||||||
=/ n-sequence=^buffer (sequence-buffer input)
|
|
||||||
=/ hash-outputs=^buffer
|
|
||||||
%- from-byts (dsha256 outputs)
|
|
||||||
=/ n-locktime=^buffer (from-atom-le 4 locktime.ut)
|
|
||||||
=/ n-hashtype=^buffer (from-atom-le 4 1)
|
|
||||||
%- dsha256
|
|
||||||
%- concat-as-byts
|
|
||||||
:~ n-version
|
|
||||||
hash-prevouts
|
|
||||||
hash-sequence
|
|
||||||
outpoint
|
|
||||||
script-code
|
|
||||||
amount
|
|
||||||
n-sequence
|
|
||||||
hash-outputs
|
|
||||||
n-locktime
|
|
||||||
n-hashtype
|
|
||||||
==
|
|
||||||
::
|
|
||||||
++ prevouts-buffer
|
|
||||||
|= =input:tx ^- ^buffer
|
|
||||||
%+ weld
|
|
||||||
(from-byts txid.input)
|
|
||||||
(from-atom-le 4 witness-ver.input)
|
|
||||||
--
|
|
||||||
::
|
|
||||||
++ sighash-legacy
|
|
||||||
:: TODO: Not working--wrong sighash for multiple inputs (works for 1)
|
|
||||||
|= index-to-sign=@
|
|
||||||
|^ ^- hash256
|
|
||||||
=/ n-version=^buffer (from-atom-le 4 version.ut)
|
|
||||||
=/ num-inputs=^buffer ~[(@ux (lent inputs.ut))]
|
|
||||||
=/ prevouts=^buffer
|
|
||||||
%- zing
|
|
||||||
(turn inputs-with-index (cury prevouts-buffer index-to-sign))
|
|
||||||
=/ num-outputs=^buffer ~[(@ux (lent outputs.ut))]
|
|
||||||
=/ outputs=^buffer
|
|
||||||
%- zing (turn outputs.ut outputs-buffer)
|
|
||||||
=/ n-locktime=^buffer (from-atom-le 4 locktime.ut)
|
|
||||||
=/ n-hashtype=^buffer (from-atom-le 4 1) :: we only support SIGHASH_ALL
|
|
||||||
=/ struct=(list ^buffer)
|
|
||||||
:~ v=n-version
|
|
||||||
ni=num-inputs
|
|
||||||
prev=prevouts
|
|
||||||
no=num-outputs
|
|
||||||
os=outputs
|
|
||||||
lock=n-locktime
|
|
||||||
hash-type=n-hashtype
|
|
||||||
==
|
|
||||||
:: ~& >>> struct
|
|
||||||
(dsha256 (concat-as-byts struct))
|
|
||||||
::
|
|
||||||
++ inputs-with-index
|
|
||||||
^- (list [@ input:tx])
|
|
||||||
%+ turn (gulf 0 (dec (lent inputs.ut)))
|
|
||||||
|= i=@ [i (snag i inputs.ut)]
|
|
||||||
++ prevouts-buffer
|
|
||||||
|= [index-to-sign=@ index=@ =input:tx]
|
|
||||||
^- ^buffer
|
|
||||||
%- zing
|
|
||||||
:~ (from-byts txid.input)
|
|
||||||
(from-atom-le 4 tx-index.input)
|
|
||||||
:: only insert script-pubkey if we're on the input index being signed
|
|
||||||
?: =(index-to-sign index)
|
|
||||||
(format-script-pubkey (from-byts script-pubkey.input))
|
|
||||||
~[0x0]
|
|
||||||
(from-byts sequence.input)
|
|
||||||
==
|
|
||||||
++ format-script-pubkey
|
|
||||||
|= spk=^buffer ^- ^buffer
|
|
||||||
?: =((^buffer ~[0x76 0xa9]) (scag 2 spk))
|
|
||||||
[0x19 spk]
|
|
||||||
spk
|
|
||||||
--
|
|
||||||
--
|
|
||||||
::
|
|
||||||
:: Converts a list of bits to a list of n-bit numbers
|
:: Converts a list of bits to a list of n-bit numbers
|
||||||
:: input-bits should be big-endian
|
:: input-bits should be big-endian
|
||||||
::
|
::
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
/- *btc, bws=btc-wallet-store, bp=btc-provider
|
/- *btc, bws=btc-wallet-store, bp=btc-provider
|
||||||
|%
|
|%
|
||||||
|
:: btc-state: state from the provider; t is last update time
|
||||||
:: req-id: hash of [xpub chyg idx]
|
:: req-id: hash of [xpub chyg idx]
|
||||||
:: pend: lookup of req-id -> requests from wallet-store
|
:: reqs: lookup of req-id -> requests from wallet-store+blockcount
|
||||||
|
:: blockcount included so that we only request address info when
|
||||||
|
:: there's a newer block, in the case of addresses we are cooking
|
||||||
::
|
::
|
||||||
:: payment: a payment expected from another ship
|
:: payment: a payment expected from another ship
|
||||||
:: - address: address generated for this payment
|
:: - address: address generated for this payment
|
||||||
@ -11,7 +14,7 @@
|
|||||||
:: checked when address updates come from btc-wallet-store
|
:: checked when address updates come from btc-wallet-store
|
||||||
::
|
::
|
||||||
+$ btc-state [blockcount=@ud fee=sats t=@da]
|
+$ btc-state [blockcount=@ud fee=sats t=@da]
|
||||||
+$ pend-addr (map req-id:bp request:bws)
|
+$ reqs (map req-id:bp [blockcount=@ud req=request:bws])
|
||||||
::
|
::
|
||||||
+$ payment [=address payer=ship value=sats]
|
+$ payment [=address payer=ship value=sats]
|
||||||
::
|
::
|
||||||
|
@ -51,10 +51,14 @@
|
|||||||
+$ txi [=utxo ur=(unit rawtx) =key]
|
+$ txi [=utxo ur=(unit rawtx) =key]
|
||||||
+$ txo [=address value=sats]
|
+$ txo [=address value=sats]
|
||||||
+$ txbu [payee=(unit ship) =vbytes txis=(list txi) txos=(list txo)]
|
+$ txbu [payee=(unit ship) =vbytes txis=(list txi) txos=(list txo)]
|
||||||
:: TODO: document
|
:: scanning addresses and monitoring generated addresses
|
||||||
|
:: batch: indexes to scan for a given chyg
|
||||||
|
:: scans: all scans underway (batches)
|
||||||
|
:: gena: any generated address that hasn't had activity yet
|
||||||
::
|
::
|
||||||
+$ batch [todo=(set idx) endpoint=idx has-used=?]
|
+$ batch [todo=(set idx) endpoint=idx has-used=?]
|
||||||
+$ scans (map [xpub chyg] batch)
|
+$ scans (map [xpub chyg] batch)
|
||||||
|
+$ gena (set address)
|
||||||
::
|
::
|
||||||
:: %add-wallet: add wallet to state and initiate a scan
|
:: %add-wallet: add wallet to state and initiate a scan
|
||||||
:: %scan: start a scan of the next address batch in a wallet
|
:: %scan: start a scan of the next address batch in a wallet
|
||||||
@ -74,8 +78,10 @@
|
|||||||
[%generate-txbu =xpub =txbu]
|
[%generate-txbu =xpub =txbu]
|
||||||
[%scan-done =xpub]
|
[%scan-done =xpub]
|
||||||
==
|
==
|
||||||
|
:: %scan-address: address we want [used? balance] for
|
||||||
|
:: %cook-address: monitor address until it gets N confs
|
||||||
::
|
::
|
||||||
+$ request
|
+$ request
|
||||||
$% [%scan-address a=address =xpub =chyg =idx]
|
$% [%address-info blockcount=@ud a=address =xpub =chyg =idx]
|
||||||
==
|
==
|
||||||
--
|
--
|
||||||
|
Loading…
Reference in New Issue
Block a user