| 187 | } |
| 188 | |
| 189 | func (self *StateStore) AddStateMerkleTreeRoot(blockHeight uint32, writeSetHash common.Uint256) error { |
| 190 | if blockHeight < self.stateHashCheckHeight { |
| 191 | return nil |
| 192 | } else if blockHeight == self.stateHashCheckHeight { |
| 193 | self.deltaMerkleTree = merkle.NewTree(0, nil, nil) |
| 194 | } |
| 195 | key := self.genStateMerkleTreeKey() |
| 196 | |
| 197 | self.deltaMerkleTree.AppendHash(writeSetHash) |
| 198 | treeSize := self.deltaMerkleTree.TreeSize() |
| 199 | hashes := self.deltaMerkleTree.Hashes() |
| 200 | value := common.NewZeroCopySink(make([]byte, 0, 4+len(hashes)*common.UINT256_SIZE)) |
| 201 | value.WriteUint32(treeSize) |
| 202 | for _, hash := range hashes { |
| 203 | value.WriteHash(hash) |
| 204 | } |
| 205 | self.store.BatchPut(key, value.Bytes()) |
| 206 | |
| 207 | key = self.genStateMerkleRootKey(blockHeight) |
| 208 | value.Reset() |
| 209 | value.WriteHash(writeSetHash) |
| 210 | value.WriteHash(self.deltaMerkleTree.Root()) |
| 211 | self.store.BatchPut(key, value.Bytes()) |
| 212 | |
| 213 | return nil |
| 214 | } |
| 215 | |
| 216 | //AddBlockMerkleTreeRoot add a new tree root |
| 217 | func (self *StateStore) AddBlockMerkleTreeRoot(txRoot common.Uint256) error { |