// AccessMerkleTree opens the Merkle tree stored in the DB. There should never be two different // MerkleTree objects accessing the same tree. func AccessMerkleTree(db kv.DB, prefix []byte, treeNonce []byte) (*MerkleTree, error) { // read the allocation count out of the DB allocCounterKey := append(append([]byte(nil), prefix...), AllocCounterKey...) val, err := db.Get(allocCounterKey) var allocCount uint64 if err == db.ErrNotFound() { allocCount = 0 } else if err != nil { return nil, err } else if len(val) != 8 { log.Panicf("bad alloc counter") } else { allocCount = binary.LittleEndian.Uint64(val) } return &MerkleTree{ treeNonce: treeNonce, db: db, nodeKeyPrefix: append(append([]byte(nil), prefix...), NodePrefix), allocCounterKey: allocCounterKey, allocCounter: allocCount, }, nil }