From 5723ac2ee781f39afd3afd7f92cfd5192316e150 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Thu, 2 Mar 2023 17:11:39 -0800 Subject: [PATCH 01/21] read, write: use an implicit prefix --- relayer.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/relayer.go b/relayer.go index 1691a86..0de62a5 100644 --- a/relayer.go +++ b/relayer.go @@ -308,7 +308,7 @@ func (r Relayer) Read(height uint64) ([][]byte, error) { if start > 0 && len(witness) > start+35 { end := len(witness) - 35 if end > start { - data = append(data, witness[start:end]) + data = append(data, witness[start+4:end]) } } } @@ -317,6 +317,7 @@ func (r Relayer) Read(height uint64) ([][]byte, error) { } func (r Relayer) Write(data []byte) (*chainhash.Hash, error) { + data = append(PROTOCOL_ID, data...) address, err := createTaprootAddress(data) if err != nil { return nil, err From 82662e63226885de7e6ffe37ad4b82bce8d7f18d Mon Sep 17 00:00:00 2001 From: Diego <31937514+Ferret-san@users.noreply.github.com> Date: Thu, 2 Mar 2023 11:42:38 -0700 Subject: [PATCH 02/21] Create generate_block.sh --- generate_block.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 generate_block.sh diff --git a/generate_block.sh b/generate_block.sh new file mode 100755 index 0000000..7a902c2 --- /dev/null +++ b/generate_block.sh @@ -0,0 +1,14 @@ +# Script to generate a new block every minute +# Put this script at the root of your unpacked folder +#!/bin/bash + +echo "Generating a block every minute. Press [CTRL+C] to stop.." + +address=`bitcoin-core.cli -regtest -rpcport=18332 -rpcuser=rpcuser -rpcpassword=rpcpass getnewaddress` + +while : +do + echo "Generate a new block `date '+%d/%m/%Y %H:%M:%S'`" + bitcoin-core.cli -regtest -rpcport=18332 -rpcuser=rpcuser -rpcpassword=rpcpass generatetoaddress 1 $address + sleep 5 +done \ No newline at end of file From 0db45c57b1adb7b589b9ffee45d01421d762a8e5 Mon Sep 17 00:00:00 2001 From: Diego <31937514+Ferret-san@users.noreply.github.com> Date: Thu, 2 Mar 2023 23:36:26 -0700 Subject: [PATCH 03/21] Adding a method to get the latest height --- generate_block.sh | 2 +- relayer.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/generate_block.sh b/generate_block.sh index 7a902c2..74cd0d3 100755 --- a/generate_block.sh +++ b/generate_block.sh @@ -10,5 +10,5 @@ while : do echo "Generate a new block `date '+%d/%m/%Y %H:%M:%S'`" bitcoin-core.cli -regtest -rpcport=18332 -rpcuser=rpcuser -rpcpassword=rpcpass generatetoaddress 1 $address - sleep 5 + sleep 1 done \ No newline at end of file diff --git a/relayer.go b/relayer.go index 0de62a5..eadb4f4 100644 --- a/relayer.go +++ b/relayer.go @@ -281,6 +281,14 @@ func NewRelayer(config Config) (*Relayer, error) { }, nil } +func (r Relayer) LatestHeight() (int64, error) { + latest, err := r.client.GetBlockCount() + if err != nil { + return -1, err + } + return latest, nil +} + func (r Relayer) Read(height uint64) ([][]byte, error) { hash, err := r.client.GetBlockHash(int64(height)) if err != nil { From 0c16874d1c4223e7dbfee1d4e2f4620ebd3bd241 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Fri, 3 Mar 2023 07:47:49 -0800 Subject: [PATCH 04/21] docs: update script --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9ba9977..e09190c 100644 --- a/README.md +++ b/README.md @@ -73,8 +73,11 @@ Writer: A commit transaction containing a taproot with one leaf script - - OP_DROP + OP_FALSE + OP_IF + "roll" marker + + OP_ENDIF OP_CHECKSIG From 2f86721592928e24a5ce31172e2771d1ed68dbaf Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Fri, 3 Mar 2023 07:53:44 -0800 Subject: [PATCH 05/21] reader: add ReadTransaction to read by tx hash --- relayer.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/relayer.go b/relayer.go index 0de62a5..5e8f45b 100644 --- a/relayer.go +++ b/relayer.go @@ -281,6 +281,33 @@ func NewRelayer(config Config) (*Relayer, error) { }, nil } +func (r Relayer) ReadTransaction(hash *chainhash.Hash) ([]byte, error) { + tx, err := r.client.GetRawTransaction(hash) + if err != nil { + return nil, err + } + if len(tx.MsgTx().TxIn[0].Witness) > 1 { + // FIXME: UGLY HACK + // ideally we should template match the script and extract + // see: txscript.ExtractAtomicSwapDataPushes + witness := tx.MsgTx().TxIn[0].Witness[1] + start := bytes.Index(witness, PROTOCOL_ID) + // script template: + // < --------- 35 bytes ---------> + // OP_FALSE OP_IF + "roll" marker + + canonical int + 32 bytes pubkey + OP_CHECKSIG + // ^ ^ + // start ------------ ^ + // end ------------------------------------- + if start > 0 && len(witness) > start+35 { + end := len(witness) - 35 + if end > start { + return witness[start+4 : end], nil + } + } + } + return nil, nil +} + func (r Relayer) Read(height uint64) ([][]byte, error) { hash, err := r.client.GetBlockHash(int64(height)) if err != nil { From 70fbb90c78961b29364b9f33ec04ca7b89ec8b21 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Fri, 3 Mar 2023 18:50:05 -0800 Subject: [PATCH 06/21] read: fix script matching --- go.mod | 10 ++++++ go.sum | 10 ++++++ relayer.go | 91 ++++++++++++++++++++++++++++++++++++------------------ 3 files changed, 81 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index b987fff..81c5c46 100644 --- a/go.mod +++ b/go.mod @@ -10,11 +10,21 @@ require ( ) require ( + github.com/aead/siphash v1.0.1 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect + github.com/btcsuite/winsvc v1.0.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/decred/dcrd/lru v1.0.0 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/jessevdk/go-flags v1.4.0 // indirect + github.com/jrick/logrotate v1.0.0 // indirect + github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 // indirect + github.com/rollkit/btcd v0.0.0-20230304003258-065fdfb84b46 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed // indirect ) diff --git a/go.sum b/go.sum index c54f555..ff60f22 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= @@ -25,6 +26,7 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -34,6 +36,7 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -44,14 +47,18 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -64,9 +71,12 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rollkit/btcd v0.0.0-20230304003258-065fdfb84b46 h1:Svr3WAt5xHdE+JgoS5r7Z+aSMhxtNvnHPItWsrlEXAY= +github.com/rollkit/btcd v0.0.0-20230304003258-065fdfb84b46/go.mod h1:FewIyVo3jCTveMYfXOJDGhUNTA6MbxH6pBJdaW/cDro= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= diff --git a/relayer.go b/relayer.go index 5e8f45b..4566b11 100644 --- a/relayer.go +++ b/relayer.go @@ -287,22 +287,14 @@ func (r Relayer) ReadTransaction(hash *chainhash.Hash) ([]byte, error) { return nil, err } if len(tx.MsgTx().TxIn[0].Witness) > 1 { - // FIXME: UGLY HACK - // ideally we should template match the script and extract - // see: txscript.ExtractAtomicSwapDataPushes witness := tx.MsgTx().TxIn[0].Witness[1] - start := bytes.Index(witness, PROTOCOL_ID) - // script template: - // < --------- 35 bytes ---------> - // OP_FALSE OP_IF + "roll" marker + + canonical int + 32 bytes pubkey + OP_CHECKSIG - // ^ ^ - // start ------------ ^ - // end ------------------------------------- - if start > 0 && len(witness) > start+35 { - end := len(witness) - 35 - if end > start { - return witness[start+4 : end], nil - } + pushData, err := ExtractPushData(0, witness) + if err != nil { + return nil, err + } + // skip PROTOCOL_ID + if pushData != nil && bytes.HasPrefix(pushData, PROTOCOL_ID) { + return pushData[4:], nil } } return nil, nil @@ -321,22 +313,14 @@ func (r Relayer) Read(height uint64) ([][]byte, error) { var data [][]byte for _, tx := range block.Transactions { if len(tx.TxIn[0].Witness) > 1 { - // FIXME: UGLY HACK - // ideally we should template match the script and extract - // see: txscript.ExtractAtomicSwapDataPushes witness := tx.TxIn[0].Witness[1] - start := bytes.Index(witness, PROTOCOL_ID) - // script template: - // < --------- 35 bytes ---------> - // OP_FALSE OP_IF + "roll" marker + + canonical int + 32 bytes pubkey + OP_CHECKSIG - // ^ ^ - // start ------------ ^ - // end ------------------------------------- - if start > 0 && len(witness) > start+35 { - end := len(witness) - 35 - if end > start { - data = append(data, witness[start+4:end]) - } + pushData, err := ExtractPushData(0, witness) + if err != nil { + return nil, err + } + // skip PROTOCOL_ID + if pushData != nil && bytes.HasPrefix(pushData, PROTOCOL_ID) { + data = append(data, pushData[4:]) } } } @@ -359,3 +343,50 @@ func (r Relayer) Write(data []byte) (*chainhash.Hash, error) { } return hash, nil } + +func ExtractPushData(version uint16, pkScript []byte) ([]byte, error) { + type templateMatch struct { + expectPushData bool + maxPushDatas int + opcode byte + extractedData []byte + } + var template = [6]templateMatch{ + {opcode: txscript.OP_FALSE}, + {opcode: txscript.OP_IF}, + {expectPushData: true, maxPushDatas: 10}, + {opcode: txscript.OP_ENDIF}, + {expectPushData: true, maxPushDatas: 1}, + {opcode: txscript.OP_CHECKSIG}, + } + + var templateOffset int + tokenizer := txscript.MakeScriptTokenizer(version, pkScript) +out: + for tokenizer.Next() { + // Not a rollkit script if it has more opcodes than expected in the + // template. + if templateOffset >= len(template) { + return nil, nil + } + + op := tokenizer.Opcode() + tplEntry := &template[templateOffset] + if tplEntry.expectPushData { + for i := 0; i < tplEntry.maxPushDatas; i++ { + data := tokenizer.Data() + if data == nil { + break out + } + tplEntry.extractedData = append(tplEntry.extractedData, data...) + tokenizer.Next() + } + } else if op != tplEntry.opcode { + return nil, nil + } + + templateOffset++ + } + // TODO: skipping err checks + return template[2].extractedData, nil +} From 1cbac32ff5445ed7c52def2072093e97ee7c78be Mon Sep 17 00:00:00 2001 From: Diego <31937514+Ferret-san@users.noreply.github.com> Date: Thu, 2 Mar 2023 11:42:38 -0700 Subject: [PATCH 07/21] Create generate_block.sh --- generate_block.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 generate_block.sh diff --git a/generate_block.sh b/generate_block.sh new file mode 100755 index 0000000..7a902c2 --- /dev/null +++ b/generate_block.sh @@ -0,0 +1,14 @@ +# Script to generate a new block every minute +# Put this script at the root of your unpacked folder +#!/bin/bash + +echo "Generating a block every minute. Press [CTRL+C] to stop.." + +address=`bitcoin-core.cli -regtest -rpcport=18332 -rpcuser=rpcuser -rpcpassword=rpcpass getnewaddress` + +while : +do + echo "Generate a new block `date '+%d/%m/%Y %H:%M:%S'`" + bitcoin-core.cli -regtest -rpcport=18332 -rpcuser=rpcuser -rpcpassword=rpcpass generatetoaddress 1 $address + sleep 5 +done \ No newline at end of file From cea61a6046a434ce40598c9992beadfc81cdf8df Mon Sep 17 00:00:00 2001 From: Diego <31937514+Ferret-san@users.noreply.github.com> Date: Thu, 2 Mar 2023 23:36:26 -0700 Subject: [PATCH 08/21] Adding a method to get the latest height --- generate_block.sh | 2 +- relayer.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/generate_block.sh b/generate_block.sh index 7a902c2..74cd0d3 100755 --- a/generate_block.sh +++ b/generate_block.sh @@ -10,5 +10,5 @@ while : do echo "Generate a new block `date '+%d/%m/%Y %H:%M:%S'`" bitcoin-core.cli -regtest -rpcport=18332 -rpcuser=rpcuser -rpcpassword=rpcpass generatetoaddress 1 $address - sleep 5 + sleep 1 done \ No newline at end of file diff --git a/relayer.go b/relayer.go index 4566b11..f1bc3fa 100644 --- a/relayer.go +++ b/relayer.go @@ -300,6 +300,14 @@ func (r Relayer) ReadTransaction(hash *chainhash.Hash) ([]byte, error) { return nil, nil } +func (r Relayer) LatestHeight() (int64, error) { + latest, err := r.client.GetBlockCount() + if err != nil { + return -1, err + } + return latest, nil +} + func (r Relayer) Read(height uint64) ([][]byte, error) { hash, err := r.client.GetBlockHash(int64(height)) if err != nil { From 982416c095f9896725749a047de701e7ab0786f4 Mon Sep 17 00:00:00 2001 From: Diego <31937514+Ferret-san@users.noreply.github.com> Date: Sat, 4 Mar 2023 12:50:38 -0700 Subject: [PATCH 09/21] tidy --- go.mod | 10 ---------- go.sum | 10 ---------- 2 files changed, 20 deletions(-) diff --git a/go.mod b/go.mod index 81c5c46..b987fff 100644 --- a/go.mod +++ b/go.mod @@ -10,21 +10,11 @@ require ( ) require ( - github.com/aead/siphash v1.0.1 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect - github.com/btcsuite/winsvc v1.0.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect - github.com/decred/dcrd/lru v1.0.0 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/jessevdk/go-flags v1.4.0 // indirect - github.com/jrick/logrotate v1.0.0 // indirect - github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 // indirect - github.com/rollkit/btcd v0.0.0-20230304003258-065fdfb84b46 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed // indirect ) diff --git a/go.sum b/go.sum index ff60f22..c54f555 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= @@ -26,7 +25,6 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -36,7 +34,6 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -47,18 +44,14 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -71,12 +64,9 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rollkit/btcd v0.0.0-20230304003258-065fdfb84b46 h1:Svr3WAt5xHdE+JgoS5r7Z+aSMhxtNvnHPItWsrlEXAY= -github.com/rollkit/btcd v0.0.0-20230304003258-065fdfb84b46/go.mod h1:FewIyVo3jCTveMYfXOJDGhUNTA6MbxH6pBJdaW/cDro= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= From 0769e79d9b370b1b5106d21c57aeed4065914428 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Sat, 4 Mar 2023 12:12:29 -0800 Subject: [PATCH 10/21] config: cleanup; params --- relayer.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/relayer.go b/relayer.go index 4566b11..28eb4e6 100644 --- a/relayer.go +++ b/relayer.go @@ -46,7 +46,7 @@ func chunkSlice(slice []byte, chunkSize int) [][]byte { // createTaprootAddress returns an address committing to a Taproot script with // a single leaf containing the spend path with the script: // OP_DROP OP_CHECKSIG -func createTaprootAddress(embeddedData []byte) (string, error) { +func createTaprootAddress(embeddedData []byte, network *chaincfg.Params) (string, error) { privKey, err := btcutil.DecodeWIF(bobPrivateKey) if err != nil { return "", fmt.Errorf("error decoding bob private key: %v", err) @@ -88,7 +88,7 @@ func createTaprootAddress(embeddedData []byte) (string, error) { // Step 3: Generate the Bech32m address. address, err := btcutil.NewAddressTaproot( - schnorr.SerializePubKey(outputKey), &chaincfg.RegressionNetParams) + schnorr.SerializePubKey(outputKey), network) if err != nil { return "", fmt.Errorf("error encoding Taproot address: %v", err) } @@ -108,6 +108,7 @@ func payToTaprootScript(taprootKey *btcec.PublicKey) ([]byte, error) { // to write binary blobs to the blockchain. type Relayer struct { client *rpcclient.Client + network *chaincfg.Params } // close shuts down the client. @@ -121,7 +122,7 @@ func (r Relayer) close() { // returns the hash of the commit transaction and error, if any. func (r Relayer) commitTx(addr string) (*chainhash.Hash, error) { // Create a transaction that sends 0.001 BTC to the given address. - address, err := btcutil.DecodeAddress(addr, &chaincfg.RegressionNetParams) + address, err := btcutil.DecodeAddress(addr, r.network) if err != nil { return nil, fmt.Errorf("error decoding recipient address: %v", err) } @@ -257,6 +258,7 @@ type Config struct { Pass string HTTPPostMode bool DisableTLS bool + Network *chaincfg.Params } // NewRelayer returns a new relayer. It can error if there's an RPC connection @@ -278,6 +280,7 @@ func NewRelayer(config Config) (*Relayer, error) { } return &Relayer{ client: client, + network: config.Network, }, nil } @@ -329,7 +332,7 @@ func (r Relayer) Read(height uint64) ([][]byte, error) { func (r Relayer) Write(data []byte) (*chainhash.Hash, error) { data = append(PROTOCOL_ID, data...) - address, err := createTaprootAddress(data) + address, err := createTaprootAddress(data, r.network) if err != nil { return nil, err } From aca0f034c9929dff6ce2cbe0da0c6d45bdc0668b Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Sat, 4 Mar 2023 12:22:09 -0800 Subject: [PATCH 11/21] cfg: sat amount, sat fee, priv key --- relayer.go | 120 ++++++++++++++++++++++++++---------------------- relayer_test.go | 10 ++-- 2 files changed, 69 insertions(+), 61 deletions(-) diff --git a/relayer.go b/relayer.go index 28eb4e6..97433d7 100644 --- a/relayer.go +++ b/relayer.go @@ -17,14 +17,15 @@ import ( // PROTOCOL_ID allows data identification by looking at the first few bytes var PROTOCOL_ID = []byte{0x72, 0x6f, 0x6c, 0x6c} +const ( + DEFAULT_SAT_AMOUNT = 1000 + DEFAULT_SAT_FEE = 200 + DEFAULT_PRIVATE_KEY = "5JoQtsKQuH8hC9MyvfJAqo6qmKLm8ePYNucs7tPu2YxG12trzBt" +) + // Sample data and keys for testing. // bob key pair is used for signing reveal tx // internal key pair is used for tweaking -var ( - bobPrivateKey = "5JoQtsKQuH8hC9MyvfJAqo6qmKLm8ePYNucs7tPu2YxG12trzBt" - internalPrivateKey = "5JGgKfRy6vEcWBpLJV5FXUfMGNXzvdWzQHUM1rVLEUJfvZUSwvS" -) - // chunkSlice splits input slice into max chunkSize length slices func chunkSlice(slice []byte, chunkSize int) [][]byte { var chunks [][]byte @@ -46,13 +47,8 @@ func chunkSlice(slice []byte, chunkSize int) [][]byte { // createTaprootAddress returns an address committing to a Taproot script with // a single leaf containing the spend path with the script: // OP_DROP OP_CHECKSIG -func createTaprootAddress(embeddedData []byte, network *chaincfg.Params) (string, error) { - privKey, err := btcutil.DecodeWIF(bobPrivateKey) - if err != nil { - return "", fmt.Errorf("error decoding bob private key: %v", err) - } - - pubKey := privKey.PrivKey.PubKey() +func createTaprootAddress(embeddedData []byte, network *chaincfg.Params, revealPrivateKeyWIF *btcutil.WIF) (string, error) { + pubKey := revealPrivateKeyWIF.PrivKey.PubKey() // Step 1: Construct the Taproot script with one leaf. builder := txscript.NewScriptBuilder() @@ -73,17 +69,10 @@ func createTaprootAddress(embeddedData []byte, network *chaincfg.Params) (string tapLeaf := txscript.NewBaseTapLeaf(pkScript) tapScriptTree := txscript.AssembleTaprootScriptTree(tapLeaf) - internalPrivKey, err := btcutil.DecodeWIF(internalPrivateKey) - if err != nil { - return "", fmt.Errorf("error decoding internal private key: %v", err) - } - - internalPubKey := internalPrivKey.PrivKey.PubKey() - // Step 2: Generate the Taproot tree. tapScriptRootHash := tapScriptTree.RootNode.TapHash() outputKey := txscript.ComputeTaprootOutputKey( - internalPubKey, tapScriptRootHash[:], + pubKey, tapScriptRootHash[:], ) // Step 3: Generate the Bech32m address. @@ -107,8 +96,11 @@ func payToTaprootScript(taprootKey *btcec.PublicKey) ([]byte, error) { // Relayer is a bitcoin client wrapper which provides reader and writer methods // to write binary blobs to the blockchain. type Relayer struct { - client *rpcclient.Client - network *chaincfg.Params + client *rpcclient.Client + network *chaincfg.Params + revealSatAmount btcutil.Amount + revealSatFee btcutil.Amount + revealPrivateKeyWIF *btcutil.WIF } // close shuts down the client. @@ -121,18 +113,13 @@ func (r Relayer) close() { // the script satisfying the tapscript spend path that commits to the data. It // returns the hash of the commit transaction and error, if any. func (r Relayer) commitTx(addr string) (*chainhash.Hash, error) { - // Create a transaction that sends 0.001 BTC to the given address. + // Create a transaction that sends revealSatAmount BTC to the given address. address, err := btcutil.DecodeAddress(addr, r.network) if err != nil { return nil, fmt.Errorf("error decoding recipient address: %v", err) } - amount, err := btcutil.NewAmount(0.001) - if err != nil { - return nil, fmt.Errorf("error creating new amount: %v", err) - } - - hash, err := r.client.SendToAddress(address, amount) + hash, err := r.client.SendToAddress(address, btcutil.Amount(r.revealSatAmount)) if err != nil { return nil, fmt.Errorf("error sending to address: %v", err) } @@ -153,26 +140,14 @@ func (r Relayer) revealTx(embeddedData []byte, commitHash *chainhash.Hash) (*cha var commitIndex int var commitOutput *wire.TxOut for i, out := range rawCommitTx.MsgTx().TxOut { - if out.Value == 100000 { + if out.Value == int64(r.revealSatAmount) { commitIndex = i commitOutput = out break } } - privKey, err := btcutil.DecodeWIF(bobPrivateKey) - if err != nil { - return nil, fmt.Errorf("error decoding bob private key: %v", err) - } - - pubKey := privKey.PrivKey.PubKey() - - internalPrivKey, err := btcutil.DecodeWIF(internalPrivateKey) - if err != nil { - return nil, fmt.Errorf("error decoding internal private key: %v", err) - } - - internalPubKey := internalPrivKey.PrivKey.PubKey() + pubKey := r.revealPrivateKeyWIF.PrivKey.PubKey() // Our script will be a simple OP_DROP OP_CHECKSIG as the // sole leaf of a tapscript tree. @@ -195,12 +170,12 @@ func (r Relayer) revealTx(embeddedData []byte, commitHash *chainhash.Hash) (*cha tapScriptTree := txscript.AssembleTaprootScriptTree(tapLeaf) ctrlBlock := tapScriptTree.LeafMerkleProofs[0].ToControlBlock( - internalPubKey, + pubKey, ) tapScriptRootHash := tapScriptTree.RootNode.TapHash() outputKey := txscript.ComputeTaprootOutputKey( - internalPubKey, tapScriptRootHash[:], + pubKey, tapScriptRootHash[:], ) p2trScript, err := payToTaprootScript(outputKey) if err != nil { @@ -215,7 +190,8 @@ func (r Relayer) revealTx(embeddedData []byte, commitHash *chainhash.Hash) (*cha }, }) txOut := &wire.TxOut{ - Value: 1e3, PkScript: p2trScript, + Value: int64(r.revealSatAmount - r.revealSatFee), + PkScript: p2trScript, } tx.AddTxOut(txOut) @@ -228,7 +204,7 @@ func (r Relayer) revealTx(embeddedData []byte, commitHash *chainhash.Hash) (*cha sig, err := txscript.RawTxInTapscriptSignature( tx, sigHashes, 0, txOut.Value, txOut.PkScript, tapLeaf, txscript.SigHashDefault, - privKey.PrivKey, + r.revealPrivateKeyWIF.PrivKey, ) if err != nil { @@ -253,12 +229,14 @@ func (r Relayer) revealTx(embeddedData []byte, commitHash *chainhash.Hash) (*cha } type Config struct { - Host string - User string - Pass string - HTTPPostMode bool - DisableTLS bool - Network *chaincfg.Params + Host string + User string + Pass string + HTTPPostMode bool + DisableTLS bool + Network string + RevealSatAmount int64 + RevealPrivateKeyWIF string } // NewRelayer returns a new relayer. It can error if there's an RPC connection @@ -278,9 +256,39 @@ func NewRelayer(config Config) (*Relayer, error) { if err != nil { return nil, fmt.Errorf("error creating btcd RPC client: %v", err) } + var network *chaincfg.Params + switch config.Network { + case "mainnet": + network = &chaincfg.MainNetParams + case "testnet": + network = &chaincfg.TestNet3Params + case "regtest": + network = &chaincfg.RegressionNetParams + default: + network = &chaincfg.RegressionNetParams + } + revealPrivateKeyWIF := config.RevealPrivateKeyWIF + if revealPrivateKeyWIF == "" { + revealPrivateKeyWIF = DEFAULT_PRIVATE_KEY + } + wif, err := btcutil.DecodeWIF(revealPrivateKeyWIF) + if err != nil { + return nil, fmt.Errorf("error decoding reveal private key: %v", err) + } + amount := btcutil.Amount(config.RevealSatAmount) + if amount == 0 { + amount = btcutil.Amount(DEFAULT_SAT_AMOUNT) + } + fee := btcutil.Amount(config.RevealSatAmount) + if fee == 0 { + fee = btcutil.Amount(DEFAULT_SAT_FEE) + } return &Relayer{ - client: client, - network: config.Network, + client: client, + network: network, + revealSatAmount: amount, + revealSatFee: fee, + revealPrivateKeyWIF: wif, }, nil } @@ -332,7 +340,7 @@ func (r Relayer) Read(height uint64) ([][]byte, error) { func (r Relayer) Write(data []byte) (*chainhash.Hash, error) { data = append(PROTOCOL_ID, data...) - address, err := createTaprootAddress(data, r.network) + address, err := createTaprootAddress(data, r.network, r.revealPrivateKeyWIF) if err != nil { return nil, err } diff --git a/relayer_test.go b/relayer_test.go index 4c4d543..4b0a524 100644 --- a/relayer_test.go +++ b/relayer_test.go @@ -38,11 +38,11 @@ func ExampleRelayer_Write() { func ExampleRelayer_Read() { // Example usage relayer, err := bitcoinda.NewRelayer(bitcoinda.Config{ - Host: "localhost:18332", - User: "rpcuser", - Pass: "rpcpass", - HTTPPostMode: true, - DisableTLS: true, + Host: "localhost:18332", + User: "rpcuser", + Pass: "rpcpass", + HTTPPostMode: true, + DisableTLS: true, }) if err != nil { fmt.Println(err) From efd5ce9dfcfa73efd70add15a3cd9846a30badaa Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Sat, 4 Mar 2023 14:09:48 -0800 Subject: [PATCH 12/21] cfg: sat fee --- relayer.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/relayer.go b/relayer.go index 97433d7..0c385da 100644 --- a/relayer.go +++ b/relayer.go @@ -236,6 +236,7 @@ type Config struct { DisableTLS bool Network string RevealSatAmount int64 + RevealSatFee int64 RevealPrivateKeyWIF string } @@ -279,7 +280,7 @@ func NewRelayer(config Config) (*Relayer, error) { if amount == 0 { amount = btcutil.Amount(DEFAULT_SAT_AMOUNT) } - fee := btcutil.Amount(config.RevealSatAmount) + fee := btcutil.Amount(config.RevealSatFee) if fee == 0 { fee = btcutil.Amount(DEFAULT_SAT_FEE) } From 0306af054bdd0a31c4a20a77d1df5fcf1ec67b60 Mon Sep 17 00:00:00 2001 From: Diego <31937514+Ferret-san@users.noreply.github.com> Date: Thu, 2 Mar 2023 11:42:38 -0700 Subject: [PATCH 13/21] Create generate_block.sh --- generate_block.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 generate_block.sh diff --git a/generate_block.sh b/generate_block.sh new file mode 100755 index 0000000..7a902c2 --- /dev/null +++ b/generate_block.sh @@ -0,0 +1,14 @@ +# Script to generate a new block every minute +# Put this script at the root of your unpacked folder +#!/bin/bash + +echo "Generating a block every minute. Press [CTRL+C] to stop.." + +address=`bitcoin-core.cli -regtest -rpcport=18332 -rpcuser=rpcuser -rpcpassword=rpcpass getnewaddress` + +while : +do + echo "Generate a new block `date '+%d/%m/%Y %H:%M:%S'`" + bitcoin-core.cli -regtest -rpcport=18332 -rpcuser=rpcuser -rpcpassword=rpcpass generatetoaddress 1 $address + sleep 5 +done \ No newline at end of file From 52566776fbc57690667c67b1fc9e066b10283deb Mon Sep 17 00:00:00 2001 From: Diego <31937514+Ferret-san@users.noreply.github.com> Date: Thu, 2 Mar 2023 23:36:26 -0700 Subject: [PATCH 14/21] Adding a method to get the latest height --- generate_block.sh | 2 +- relayer.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/generate_block.sh b/generate_block.sh index 7a902c2..74cd0d3 100755 --- a/generate_block.sh +++ b/generate_block.sh @@ -10,5 +10,5 @@ while : do echo "Generate a new block `date '+%d/%m/%Y %H:%M:%S'`" bitcoin-core.cli -regtest -rpcport=18332 -rpcuser=rpcuser -rpcpassword=rpcpass generatetoaddress 1 $address - sleep 5 + sleep 1 done \ No newline at end of file diff --git a/relayer.go b/relayer.go index 0c385da..540292b 100644 --- a/relayer.go +++ b/relayer.go @@ -312,6 +312,14 @@ func (r Relayer) ReadTransaction(hash *chainhash.Hash) ([]byte, error) { return nil, nil } +func (r Relayer) LatestHeight() (int64, error) { + latest, err := r.client.GetBlockCount() + if err != nil { + return -1, err + } + return latest, nil +} + func (r Relayer) Read(height uint64) ([][]byte, error) { hash, err := r.client.GetBlockHash(int64(height)) if err != nil { From 61b2d8156bb0ea1eed2f04b65408b056c81b96e9 Mon Sep 17 00:00:00 2001 From: Diego <31937514+Ferret-san@users.noreply.github.com> Date: Sat, 4 Mar 2023 12:50:38 -0700 Subject: [PATCH 15/21] tidy --- go.mod | 10 ---------- go.sum | 10 ---------- 2 files changed, 20 deletions(-) diff --git a/go.mod b/go.mod index 81c5c46..b987fff 100644 --- a/go.mod +++ b/go.mod @@ -10,21 +10,11 @@ require ( ) require ( - github.com/aead/siphash v1.0.1 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect - github.com/btcsuite/winsvc v1.0.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect - github.com/decred/dcrd/lru v1.0.0 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/jessevdk/go-flags v1.4.0 // indirect - github.com/jrick/logrotate v1.0.0 // indirect - github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 // indirect - github.com/rollkit/btcd v0.0.0-20230304003258-065fdfb84b46 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed // indirect ) diff --git a/go.sum b/go.sum index ff60f22..c54f555 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= @@ -26,7 +25,6 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -36,7 +34,6 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -47,18 +44,14 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -71,12 +64,9 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rollkit/btcd v0.0.0-20230304003258-065fdfb84b46 h1:Svr3WAt5xHdE+JgoS5r7Z+aSMhxtNvnHPItWsrlEXAY= -github.com/rollkit/btcd v0.0.0-20230304003258-065fdfb84b46/go.mod h1:FewIyVo3jCTveMYfXOJDGhUNTA6MbxH6pBJdaW/cDro= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= From ad9e6bdcb4072fc4605448b6ab276723b54cfdca Mon Sep 17 00:00:00 2001 From: Diego Date: Sat, 4 Mar 2023 22:02:00 -0700 Subject: [PATCH 16/21] Implement smart fee estimation --- relayer.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/relayer.go b/relayer.go index 540292b..552d9a5 100644 --- a/relayer.go +++ b/relayer.go @@ -6,6 +6,7 @@ import ( "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/btcjson" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" @@ -99,7 +100,6 @@ type Relayer struct { client *rpcclient.Client network *chaincfg.Params revealSatAmount btcutil.Amount - revealSatFee btcutil.Amount revealPrivateKeyWIF *btcutil.WIF } @@ -189,8 +189,13 @@ func (r Relayer) revealTx(embeddedData []byte, commitHash *chainhash.Hash) (*cha Index: uint32(commitIndex), }, }) + + revealSatFee, err := r.client.EstimateSmartFee(1, &btcjson.EstimateModeConservative) + if err != nil { + return nil, fmt.Errorf("error getting sat fee: %v", err) + } txOut := &wire.TxOut{ - Value: int64(r.revealSatAmount - r.revealSatFee), + Value: int64(r.revealSatAmount - btcutil.Amount(*revealSatFee.FeeRate)), PkScript: p2trScript, } tx.AddTxOut(txOut) @@ -236,7 +241,6 @@ type Config struct { DisableTLS bool Network string RevealSatAmount int64 - RevealSatFee int64 RevealPrivateKeyWIF string } @@ -280,15 +284,10 @@ func NewRelayer(config Config) (*Relayer, error) { if amount == 0 { amount = btcutil.Amount(DEFAULT_SAT_AMOUNT) } - fee := btcutil.Amount(config.RevealSatFee) - if fee == 0 { - fee = btcutil.Amount(DEFAULT_SAT_FEE) - } return &Relayer{ client: client, network: network, revealSatAmount: amount, - revealSatFee: fee, revealPrivateKeyWIF: wif, }, nil } From dd1cbabc11144eebb85dd5bf37101c8aa72834ee Mon Sep 17 00:00:00 2001 From: Diego Date: Sat, 4 Mar 2023 22:49:08 -0700 Subject: [PATCH 17/21] Revert "Implement smart fee estimation" This reverts commit ad9e6bdcb4072fc4605448b6ab276723b54cfdca. --- relayer.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/relayer.go b/relayer.go index 552d9a5..540292b 100644 --- a/relayer.go +++ b/relayer.go @@ -6,7 +6,6 @@ import ( "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcec/v2/schnorr" - "github.com/btcsuite/btcd/btcjson" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" @@ -100,6 +99,7 @@ type Relayer struct { client *rpcclient.Client network *chaincfg.Params revealSatAmount btcutil.Amount + revealSatFee btcutil.Amount revealPrivateKeyWIF *btcutil.WIF } @@ -189,13 +189,8 @@ func (r Relayer) revealTx(embeddedData []byte, commitHash *chainhash.Hash) (*cha Index: uint32(commitIndex), }, }) - - revealSatFee, err := r.client.EstimateSmartFee(1, &btcjson.EstimateModeConservative) - if err != nil { - return nil, fmt.Errorf("error getting sat fee: %v", err) - } txOut := &wire.TxOut{ - Value: int64(r.revealSatAmount - btcutil.Amount(*revealSatFee.FeeRate)), + Value: int64(r.revealSatAmount - r.revealSatFee), PkScript: p2trScript, } tx.AddTxOut(txOut) @@ -241,6 +236,7 @@ type Config struct { DisableTLS bool Network string RevealSatAmount int64 + RevealSatFee int64 RevealPrivateKeyWIF string } @@ -284,10 +280,15 @@ func NewRelayer(config Config) (*Relayer, error) { if amount == 0 { amount = btcutil.Amount(DEFAULT_SAT_AMOUNT) } + fee := btcutil.Amount(config.RevealSatFee) + if fee == 0 { + fee = btcutil.Amount(DEFAULT_SAT_FEE) + } return &Relayer{ client: client, network: network, revealSatAmount: amount, + revealSatFee: fee, revealPrivateKeyWIF: wif, }, nil } From 889528c4b2f2b8f2bd4e7857a0a8e87c66c1f1a0 Mon Sep 17 00:00:00 2001 From: Diego Date: Sat, 4 Mar 2023 23:08:03 -0700 Subject: [PATCH 18/21] Update relayer.go --- relayer.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/relayer.go b/relayer.go index 540292b..de0bd99 100644 --- a/relayer.go +++ b/relayer.go @@ -189,8 +189,25 @@ func (r Relayer) revealTx(embeddedData []byte, commitHash *chainhash.Hash) (*cha Index: uint32(commitIndex), }, }) + + var fee int64 + if r.network.Name != "regtest" { + smartFee, err := r.client.EstimateSmartFee(1, nil) + if err != nil { + return nil, fmt.Errorf("error getting sat fee: %v", err) + } + revealSatFee, err := btcutil.NewAmount(*smartFee.FeeRate) + if err != nil { + return nil, fmt.Errorf("error getting sat fee: %v", err) + } + txSize := tx.SerializeSize() + fee = int64(revealSatFee) * int64(txSize) + } else { + fee = int64(r.revealSatAmount - r.revealSatFee) + } + txOut := &wire.TxOut{ - Value: int64(r.revealSatAmount - r.revealSatFee), + Value: fee, PkScript: p2trScript, } tx.AddTxOut(txOut) From 9d13672cd9d43053da1d3e495d01a8bef3caca85 Mon Sep 17 00:00:00 2001 From: Diego Date: Sat, 4 Mar 2023 23:49:03 -0700 Subject: [PATCH 19/21] Update relayer.go --- relayer.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/relayer.go b/relayer.go index de0bd99..d945fec 100644 --- a/relayer.go +++ b/relayer.go @@ -99,7 +99,6 @@ type Relayer struct { client *rpcclient.Client network *chaincfg.Params revealSatAmount btcutil.Amount - revealSatFee btcutil.Amount revealPrivateKeyWIF *btcutil.WIF } @@ -196,6 +195,9 @@ func (r Relayer) revealTx(embeddedData []byte, commitHash *chainhash.Hash) (*cha if err != nil { return nil, fmt.Errorf("error getting sat fee: %v", err) } + if smartFee.FeeRate == nil { + return nil, fmt.Errorf("got nil smart fee for non regtest environment: %v", err) + } revealSatFee, err := btcutil.NewAmount(*smartFee.FeeRate) if err != nil { return nil, fmt.Errorf("error getting sat fee: %v", err) @@ -203,7 +205,7 @@ func (r Relayer) revealTx(embeddedData []byte, commitHash *chainhash.Hash) (*cha txSize := tx.SerializeSize() fee = int64(revealSatFee) * int64(txSize) } else { - fee = int64(r.revealSatAmount - r.revealSatFee) + fee = 99000 } txOut := &wire.TxOut{ @@ -253,7 +255,6 @@ type Config struct { DisableTLS bool Network string RevealSatAmount int64 - RevealSatFee int64 RevealPrivateKeyWIF string } @@ -297,15 +298,10 @@ func NewRelayer(config Config) (*Relayer, error) { if amount == 0 { amount = btcutil.Amount(DEFAULT_SAT_AMOUNT) } - fee := btcutil.Amount(config.RevealSatFee) - if fee == 0 { - fee = btcutil.Amount(DEFAULT_SAT_FEE) - } return &Relayer{ client: client, network: network, revealSatAmount: amount, - revealSatFee: fee, revealPrivateKeyWIF: wif, }, nil } From 39851d88a64209491cc76fa52b280a7f6a811016 Mon Sep 17 00:00:00 2001 From: Diego Date: Sun, 5 Mar 2023 00:07:20 -0700 Subject: [PATCH 20/21] Fix fee issue --- relayer.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/relayer.go b/relayer.go index d945fec..306de24 100644 --- a/relayer.go +++ b/relayer.go @@ -18,7 +18,7 @@ import ( var PROTOCOL_ID = []byte{0x72, 0x6f, 0x6c, 0x6c} const ( - DEFAULT_SAT_AMOUNT = 1000 + DEFAULT_SAT_AMOUNT = 100000 DEFAULT_SAT_FEE = 200 DEFAULT_PRIVATE_KEY = "5JoQtsKQuH8hC9MyvfJAqo6qmKLm8ePYNucs7tPu2YxG12trzBt" ) @@ -205,7 +205,7 @@ func (r Relayer) revealTx(embeddedData []byte, commitHash *chainhash.Hash) (*cha txSize := tx.SerializeSize() fee = int64(revealSatFee) * int64(txSize) } else { - fee = 99000 + fee = 1e3 } txOut := &wire.TxOut{ From abc238f88e6252959f8aef9ba73d9b6dd3869eee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?joshcs=2Eeth=20=E1=B5=8D=E1=B5=90?= <46639943+jcstein@users.noreply.github.com> Date: Sat, 4 Mar 2023 22:40:34 -1000 Subject: [PATCH 21/21] Update generate_block.sh --- generate_block.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/generate_block.sh b/generate_block.sh index 74cd0d3..05e0ab3 100755 --- a/generate_block.sh +++ b/generate_block.sh @@ -1,8 +1,8 @@ -# Script to generate a new block every minute +# Script to generate a new block every second # Put this script at the root of your unpacked folder #!/bin/bash -echo "Generating a block every minute. Press [CTRL+C] to stop.." +echo "Generating a block every second. Press [CTRL+C] to stop.." address=`bitcoin-core.cli -regtest -rpcport=18332 -rpcuser=rpcuser -rpcpassword=rpcpass getnewaddress` @@ -11,4 +11,4 @@ do echo "Generate a new block `date '+%d/%m/%Y %H:%M:%S'`" bitcoin-core.cli -regtest -rpcport=18332 -rpcuser=rpcuser -rpcpassword=rpcpass generatetoaddress 1 $address sleep 1 -done \ No newline at end of file +done