func anchorChainToDirBlockInfo(aRecord *anchor.AnchorRecord) (*common.DirBlockInfo, error) { dirBlockInfo := new(common.DirBlockInfo) dirBlockInfo.DBHeight = aRecord.DBHeight dirBlockInfo.BTCTxOffset = aRecord.Bitcoin.Offset dirBlockInfo.BTCBlockHeight = aRecord.Bitcoin.BlockHeight mrBytes, _ := hex.DecodeString(aRecord.KeyMR) dirBlockInfo.DBMerkleRoot, _ = common.NewShaHash(mrBytes) dirBlockInfo.BTCConfirmed = true txSha, _ := wire.NewShaHashFromStr(aRecord.Bitcoin.TXID) dirBlockInfo.BTCTxHash = toHash(txSha) blkSha, _ := wire.NewShaHashFromStr(aRecord.Bitcoin.BlockHash) dirBlockInfo.BTCBlockHash = toHash(blkSha) dblock, err := db.FetchDBlockByHeight(aRecord.DBHeight) if err != nil { fmt.Printf("err in FetchDBlockByHeight: %d\n", aRecord.DBHeight) dirBlockInfo.DBHash = new(common.Hash) } else { dirBlockInfo.Timestamp = int64(dblock.Header.Timestamp * 60) dirBlockInfo.DBHash = dblock.DBHash } fmt.Printf("dirBlockInfo: %s\n", spew.Sdump(dirBlockInfo)) return dirBlockInfo, nil }
// FetchAllUnconfirmedDirBlockInfo gets all of the dirBlockInfos that have BTC Anchor confirmation func (db *LevelDb) FetchAllUnconfirmedDirBlockInfo() (dirBlockInfoMap map[string]*common.DirBlockInfo, err error) { db.dbLock.Lock() defer db.dbLock.Unlock() var fromkey []byte = []byte{byte(TBL_DB_INFO)} // Table Name (1 bytes) var tokey []byte = []byte{byte(TBL_DB_INFO + 1)} // Table Name (1 bytes) dirBlockInfoMap = make(map[string]*common.DirBlockInfo) iter := db.lDb.NewIterator(&util.Range{Start: fromkey, Limit: tokey}, db.ro) for iter.Next() { dBInfo := new(common.DirBlockInfo) // The last byte stores the confirmation flag if iter.Value()[len(iter.Value())-1] == 0 { _, err := dBInfo.UnmarshalBinaryData(iter.Value()) if err != nil { return dirBlockInfoMap, err } dirBlockInfoMap[dBInfo.DBMerkleRoot.String()] = dBInfo } } iter.Release() err = iter.Error() return dirBlockInfoMap, err }
// Insert the Directory Block meta data into db func (db *LevelDb) InsertDirBlockInfo(dirBlockInfo *common.DirBlockInfo) (err error) { if dirBlockInfo.BTCTxHash == nil { return } db.dbLock.Lock() defer db.dbLock.Unlock() if db.lbatch == nil { db.lbatch = new(leveldb.Batch) } defer db.lbatch.Reset() var key []byte = []byte{byte(TBL_DB_INFO)} // Table Name (1 bytes) key = append(key, dirBlockInfo.DBHash.Bytes()...) binaryDirBlockInfo, _ := dirBlockInfo.MarshalBinary() db.lbatch.Put(key, binaryDirBlockInfo) err = db.lDb.Write(db.lbatch, db.wo) if err != nil { return err } return nil }
func (db *LevelDb) InsertDirBlockInfoMultiBatch(dirBlockInfo *common.DirBlockInfo) (err error) { if dirBlockInfo == nil { return nil } if dirBlockInfo.BTCTxHash == nil { return } if db.lbatch == nil { return fmt.Errorf("db.lbatch == nil") } if db.lbatch == nil { db.lbatch = new(leveldb.Batch) } defer db.lbatch.Reset() var key = []byte{byte(TBL_DB_INFO)} // Table Name (1 bytes) key = append(key, dirBlockInfo.DBHash.Bytes()...) binaryDirBlockInfo, _ := dirBlockInfo.MarshalBinary() db.lbatch.Put(key, binaryDirBlockInfo) return nil }
func doTransaction(hash *common.Hash, blockHeight uint64, dirBlockInfo *common.DirBlockInfo) (*wire.ShaHash, error) { b := balances[0] i := copy(balances, balances[1:]) balances[i] = b msgtx, err := createRawTransaction(b, hash.Bytes(), blockHeight) if err != nil { return nil, fmt.Errorf("cannot create Raw Transaction: %s", err) } shaHash, err := sendRawTransaction(msgtx) if err != nil { return nil, fmt.Errorf("cannot send Raw Transaction: %s", err) } // for test purpose if dirBlockInfo != nil { dirBlockInfo.BTCTxHash = toHash(shaHash) } return shaHash, nil }
func doTransaction(hash *common.Hash, blockHeight uint32, dirBlockInfo *common.DirBlockInfo) (*wire.ShaHash, error) { b := balances[0] balances = balances[1:] anchorLog.Info("new balances.len=", len(balances)) msgtx, err := createRawTransaction(b, hash.Bytes(), blockHeight) if err != nil { return nil, fmt.Errorf("cannot create Raw Transaction: %s", err) } shaHash, err := sendRawTransaction(msgtx) if err != nil { return nil, fmt.Errorf("cannot send Raw Transaction: %s", err) } if dirBlockInfo != nil { dirBlockInfo.BTCTxHash = toHash(shaHash) } return shaHash, nil }