// Retrieve an object in a Merkle tree, // validating the entire path in the process. // Returns a slice of a buffer obtained from HashGet.Get(), // which might be shared and should be considered read-only. func MerkleGet(suite abstract.Suite, root []byte, path MerklePath, ctx HashGet) ([]byte, error) { // Follow pointers through intermediate levels blob := root for i := range path.Ptr { beg := path.Ptr[i] end := beg + suite.HashLen() if end > len(blob) { return nil, errors.New("bad Merkle tree pointer offset") } id := HashId(blob[beg:end]) b, e := ctx.Get(id) // Lookup the next-level blob if e != nil { return nil, e } blob = b } // Validate and extract the actual object beg := path.Ofs end := beg + path.Len if end > len(blob) { return nil, errors.New("bad Merkle tree object offset/length") } return blob[beg:end], nil }