diff --git a/uspv/eight333.go b/uspv/eight333.go index 045ec742..22f582e4 100644 --- a/uspv/eight333.go +++ b/uspv/eight333.go @@ -164,6 +164,7 @@ func (s *SPVCon) PongBack(nonce uint64) { func (s *SPVCon) SendFilter(f *bloom.Filter) { s.outMsgQueue <- f.MsgFilterLoad() + return } @@ -374,12 +375,35 @@ func (s *SPVCon) AskForMerkBlocks(current, last int32) error { last = int32(n / 80) } - _, err := s.headerFile.Seek(int64(current*80), os.SEEK_SET) + // track number of utxos + track := len(s.TS.Utxos) + // create initial filter + filt, err := s.TS.GimmeFilter() + if err != nil { + return err + } + // send filter + s.SendFilter(filt) + fmt.Printf("sent filter %x\n", filt.MsgFilterLoad().Filter) + + _, err = s.headerFile.Seek(int64(current*80), os.SEEK_SET) if err != nil { return err } // loop through all heights where we want merkleblocks. for current < last { + // check if we need to update filter... every 5 new inputs...? + if track+4 < len(s.TS.Utxos) { + track = len(s.TS.Utxos) + filt, err := s.TS.GimmeFilter() + if err != nil { + return err + } + s.SendFilter(filt) + + fmt.Printf("sent filter %x\n", filt.MsgFilterLoad().Filter) + } + // load header from file err = hdr.Deserialize(s.headerFile) if err != nil { @@ -400,6 +424,5 @@ func (s *SPVCon) AskForMerkBlocks(current, last int32) error { s.mBlockQueue <- rah // push height and mroot of requested block on queue current++ } - return nil } diff --git a/uspv/msghandler.go b/uspv/msghandler.go index 3d072832..b3ee6822 100644 --- a/uspv/msghandler.go +++ b/uspv/msghandler.go @@ -1,7 +1,6 @@ package uspv import ( - "fmt" "log" "github.com/btcsuite/btcd/wire" @@ -40,7 +39,7 @@ func (s *SPVCon) incomingMessageHandler() { log.Printf("Merkle block error: %s\n", err.Error()) return } - fmt.Printf(" got %d txs ", len(txids)) + // fmt.Printf(" got %d txs ", len(txids)) // fmt.Printf(" = got %d txs from block %s\n", // len(txids), m.Header.BlockSha().String()) rah := <-s.mBlockQueue // pop height off mblock queue @@ -70,7 +69,12 @@ func (s *SPVCon) incomingMessageHandler() { if err != nil { log.Printf("Incoming Tx error: %s\n", err.Error()) } - // log.Printf("Got tx %s\n", m.TxSha().String()) + // log.Printf("Got tx %s\n", m.TxSha().String()) + + case *wire.MsgReject: + log.Printf("Rejected! cmd: %s code: %s tx: %s reason: %s", + m.Cmd, m.Code.String(), m.Hash.String(), m.Reason) + default: log.Printf("Got unknown message type %s\n", m.Command()) } diff --git a/uspv/txstore.go b/uspv/txstore.go index c7bd604a..23c4b35c 100644 --- a/uspv/txstore.go +++ b/uspv/txstore.go @@ -78,10 +78,17 @@ func (t *TxStore) GimmeFilter() (*bloom.Filter, error) { if len(t.Adrs) == 0 { return nil, fmt.Errorf("no addresses to filter for") } - f := bloom.NewFilter(uint32(len(t.Adrs)), 0, 0.001, wire.BloomUpdateNone) + // add addresses to look for incoming + elem := uint32(len(t.Adrs) + len(t.Utxos)) + f := bloom.NewFilter(elem, 0, 0.001, wire.BloomUpdateAll) for _, a := range t.Adrs { f.Add(a.PkhAdr.ScriptAddress()) } + // add txids of utxos to look for outgoing + for _, u := range t.Utxos { + f.AddOutPoint(&u.Op) + } + return f, nil } @@ -137,7 +144,6 @@ func (t *TxStore) AbsorbTx(tx *wire.MsgTx, height int32) error { if err != nil { return err } - t.Sum += newu.Value t.Utxos = append(t.Utxos, newu) break } diff --git a/uspv/utxodb.go b/uspv/utxodb.go index 9c5704ff..68da11b3 100644 --- a/uspv/utxodb.go +++ b/uspv/utxodb.go @@ -185,8 +185,8 @@ func (ts *TxStore) LoadFromDB() error { return err } // and add it to ram - ts.Sum += newU.Value ts.Utxos = append(ts.Utxos, newU) + ts.Sum += newU.Value } else { fmt.Printf("had utxo %x but spent by tx %x...\n", k, stx[:8])