merge AddressIndex and OutpointsIndex behind one method
This commit is contained in:
parent
ef4ee32277
commit
7006753a0f
17
blockbook.go
17
blockbook.go
@ -23,12 +23,8 @@ type AddressTransactionOracle interface {
|
|||||||
GetAddressTransactions(address string, lower uint32, higher uint32, fn func(txids []string) error) error
|
GetAddressTransactions(address string, lower uint32, higher uint32, fn func(txids []string) error) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type OutpointIndex interface {
|
type BlockIndex interface {
|
||||||
IndexBlockOutpoints(block *Block) error
|
IndexBlock(block *Block, txids map[string][]string) error
|
||||||
}
|
|
||||||
|
|
||||||
type AddressIndex interface {
|
|
||||||
IndexBlockAddresses(block *Block, txids map[string][]string) error
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -86,7 +82,7 @@ func main() {
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if err = indexBlocks(rpc, rpc, db, db, height, until); err != nil {
|
if err = indexBlocks(rpc, rpc, db, height, until); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -148,7 +144,7 @@ func (tx *Tx) CollectAddresses(o OutpointAddressOracle) ([]string, error) {
|
|||||||
return addrs, nil
|
return addrs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func indexBlocks(bo BlockOracle, oao OutpointAddressOracle, ai AddressIndex, oi OutpointIndex, lower uint32, higher uint32) error {
|
func indexBlocks(bo BlockOracle, oao OutpointAddressOracle, bi BlockIndex, lower uint32, higher uint32) error {
|
||||||
for height := lower; height <= higher; height++ {
|
for height := lower; height <= higher; height++ {
|
||||||
hash, err := bo.GetBlockHash(height)
|
hash, err := bo.GetBlockHash(height)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -162,10 +158,7 @@ func indexBlocks(bo BlockOracle, oao OutpointAddressOracle, ai AddressIndex, oi
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := oi.IndexBlockOutpoints(block); err != nil {
|
if err := bi.IndexBlock(block, addrs); err != nil {
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := ai.IndexBlockAddresses(block, addrs); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
57
rocksdb.go
57
rocksdb.go
@ -87,14 +87,28 @@ func (d *RocksDB) GetAddressTransactions(address string, lower uint32, higher ui
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Address Index
|
func (d *RocksDB) IndexBlock(block *Block, txids map[string][]string) error {
|
||||||
|
|
||||||
func (d *RocksDB) IndexBlockAddresses(block *Block, txids map[string][]string) error {
|
|
||||||
log.Printf("rocksdb: address put %d in %d %s", len(txids), block.Height, block.Hash)
|
|
||||||
|
|
||||||
wb := gorocksdb.NewWriteBatch()
|
wb := gorocksdb.NewWriteBatch()
|
||||||
defer wb.Destroy()
|
defer wb.Destroy()
|
||||||
|
|
||||||
|
if err := d.writeHeight(wb, block); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := d.writeOutpoints(wb, block); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := d.writeAddresses(wb, block, txids); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return d.db.Write(d.wo, wb)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Address Index
|
||||||
|
|
||||||
|
func (d *RocksDB) writeAddresses(wb *gorocksdb.WriteBatch, block *Block, txids map[string][]string) error {
|
||||||
|
log.Printf("rocksdb: address put %d in %d %s", len(txids), block.Height, block.Hash)
|
||||||
|
|
||||||
for addr, txids := range txids {
|
for addr, txids := range txids {
|
||||||
k, err := packAddressKey(block.Height, addr)
|
k, err := packAddressKey(block.Height, addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -106,8 +120,7 @@ func (d *RocksDB) IndexBlockAddresses(block *Block, txids map[string][]string) e
|
|||||||
}
|
}
|
||||||
wb.Put(k, v)
|
wb.Put(k, v)
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
return d.db.Write(d.wo, wb)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func packAddressKey(height uint32, address string) (b []byte, err error) {
|
func packAddressKey(height uint32, address string) (b []byte, err error) {
|
||||||
@ -146,19 +159,9 @@ func unpackAddressVal(b []byte) (txids []string, err error) {
|
|||||||
|
|
||||||
// Outpoint index
|
// Outpoint index
|
||||||
|
|
||||||
func (d *RocksDB) IndexBlockOutpoints(block *Block) error {
|
func (d *RocksDB) writeOutpoints(wb *gorocksdb.WriteBatch, block *Block) error {
|
||||||
log.Printf("rocksdb: outpoints put %d in %d %s", len(block.Txs), block.Height, block.Hash)
|
log.Printf("rocksdb: outpoints put %d in %d %s", len(block.Txs), block.Height, block.Hash)
|
||||||
|
|
||||||
wb := gorocksdb.NewWriteBatch()
|
|
||||||
defer wb.Destroy()
|
|
||||||
|
|
||||||
bv, err := packBlockValue(block.Hash)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
bk := packUint(block.Height)
|
|
||||||
wb.Put(bk, bv)
|
|
||||||
|
|
||||||
for _, tx := range block.Txs {
|
for _, tx := range block.Txs {
|
||||||
for _, vout := range tx.Vout {
|
for _, vout := range tx.Vout {
|
||||||
k, err := packOutpointKey(block.Height, tx.Txid, vout.N)
|
k, err := packOutpointKey(block.Height, tx.Txid, vout.N)
|
||||||
@ -172,8 +175,7 @@ func (d *RocksDB) IndexBlockOutpoints(block *Block) error {
|
|||||||
wb.Put(k, v)
|
wb.Put(k, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
return d.db.Write(d.wo, wb)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func packOutpointKey(height uint32, txid string, vout uint32) (b []byte, err error) {
|
func packOutpointKey(height uint32, txid string, vout uint32) (b []byte, err error) {
|
||||||
@ -223,6 +225,21 @@ func unpackOutpointValue(b []byte) (addrs []string, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Block index
|
||||||
|
|
||||||
|
func (d *RocksDB) writeHeight(wb *gorocksdb.WriteBatch, block *Block) error {
|
||||||
|
log.Printf("rocksdb: height put %d %s", block.Height, block.Hash)
|
||||||
|
|
||||||
|
bv, err := packBlockValue(block.Hash)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
bk := packUint(block.Height)
|
||||||
|
wb.Put(bk, bv)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Helpers
|
// Helpers
|
||||||
|
|
||||||
func packUint(i uint32) []byte {
|
func packUint(i uint32) []byte {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user