trie.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. package trie
  2. import (
  3. "bytes"
  4. "container/list"
  5. "fmt"
  6. "sync"
  7. "github.com/ethereum/go-ethereum/crypto"
  8. "github.com/ethereum/go-ethereum/ethutil"
  9. )
  10. func ParanoiaCheck(t1 *Trie, backend Backend) (bool, *Trie) {
  11. t2 := New(nil, backend)
  12. it := t1.Iterator()
  13. for it.Next() {
  14. t2.Update(it.Key, it.Value)
  15. }
  16. return bytes.Equal(t2.Hash(), t1.Hash()), t2
  17. }
  18. type Trie struct {
  19. mu sync.Mutex
  20. root Node
  21. roothash []byte
  22. cache *Cache
  23. revisions *list.List
  24. }
  25. func New(root []byte, backend Backend) *Trie {
  26. trie := &Trie{}
  27. trie.revisions = list.New()
  28. trie.roothash = root
  29. if backend != nil {
  30. trie.cache = NewCache(backend)
  31. }
  32. if root != nil {
  33. value := ethutil.NewValueFromBytes(trie.cache.Get(root))
  34. trie.root = trie.mknode(value)
  35. }
  36. return trie
  37. }
  38. func (self *Trie) Iterator() *Iterator {
  39. return NewIterator(self)
  40. }
  41. func (self *Trie) Copy() *Trie {
  42. cpy := make([]byte, 32)
  43. copy(cpy, self.roothash)
  44. trie := New(nil, nil)
  45. trie.cache = self.cache.Copy()
  46. if self.root != nil {
  47. trie.root = self.root.Copy(trie)
  48. }
  49. return trie
  50. }
  51. // Legacy support
  52. func (self *Trie) Root() []byte { return self.Hash() }
  53. func (self *Trie) Hash() []byte {
  54. var hash []byte
  55. if self.root != nil {
  56. t := self.root.Hash()
  57. if byts, ok := t.([]byte); ok && len(byts) > 0 {
  58. hash = byts
  59. } else {
  60. hash = crypto.Sha3(ethutil.Encode(self.root.RlpData()))
  61. }
  62. } else {
  63. hash = crypto.Sha3(ethutil.Encode(""))
  64. }
  65. if !bytes.Equal(hash, self.roothash) {
  66. self.revisions.PushBack(self.roothash)
  67. self.roothash = hash
  68. }
  69. return hash
  70. }
  71. func (self *Trie) Commit() {
  72. self.mu.Lock()
  73. defer self.mu.Unlock()
  74. // Hash first
  75. self.Hash()
  76. self.cache.Flush()
  77. }
  78. // Reset should only be called if the trie has been hashed
  79. func (self *Trie) Reset() {
  80. self.mu.Lock()
  81. defer self.mu.Unlock()
  82. self.cache.Reset()
  83. if self.revisions.Len() > 0 {
  84. revision := self.revisions.Remove(self.revisions.Back()).([]byte)
  85. self.roothash = revision
  86. }
  87. value := ethutil.NewValueFromBytes(self.cache.Get(self.roothash))
  88. self.root = self.mknode(value)
  89. }
  90. func (self *Trie) UpdateString(key, value string) Node { return self.Update([]byte(key), []byte(value)) }
  91. func (self *Trie) Update(key, value []byte) Node {
  92. self.mu.Lock()
  93. defer self.mu.Unlock()
  94. k := CompactHexDecode(string(key))
  95. if len(value) != 0 {
  96. self.root = self.insert(self.root, k, &ValueNode{self, value})
  97. } else {
  98. self.root = self.delete(self.root, k)
  99. }
  100. return self.root
  101. }
  102. func (self *Trie) GetString(key string) []byte { return self.Get([]byte(key)) }
  103. func (self *Trie) Get(key []byte) []byte {
  104. self.mu.Lock()
  105. defer self.mu.Unlock()
  106. k := CompactHexDecode(string(key))
  107. n := self.get(self.root, k)
  108. if n != nil {
  109. return n.(*ValueNode).Val()
  110. }
  111. return nil
  112. }
  113. func (self *Trie) DeleteString(key string) Node { return self.Delete([]byte(key)) }
  114. func (self *Trie) Delete(key []byte) Node {
  115. self.mu.Lock()
  116. defer self.mu.Unlock()
  117. k := CompactHexDecode(string(key))
  118. self.root = self.delete(self.root, k)
  119. return self.root
  120. }
  121. func (self *Trie) insert(node Node, key []byte, value Node) Node {
  122. if len(key) == 0 {
  123. return value
  124. }
  125. if node == nil {
  126. return NewShortNode(self, key, value)
  127. }
  128. switch node := node.(type) {
  129. case *ShortNode:
  130. k := node.Key()
  131. cnode := node.Value()
  132. if bytes.Equal(k, key) {
  133. return NewShortNode(self, key, value)
  134. }
  135. var n Node
  136. matchlength := MatchingNibbleLength(key, k)
  137. if matchlength == len(k) {
  138. n = self.insert(cnode, key[matchlength:], value)
  139. } else {
  140. pnode := self.insert(nil, k[matchlength+1:], cnode)
  141. nnode := self.insert(nil, key[matchlength+1:], value)
  142. fulln := NewFullNode(self)
  143. fulln.set(k[matchlength], pnode)
  144. fulln.set(key[matchlength], nnode)
  145. n = fulln
  146. }
  147. if matchlength == 0 {
  148. return n
  149. }
  150. return NewShortNode(self, key[:matchlength], n)
  151. case *FullNode:
  152. cpy := node.Copy(self).(*FullNode)
  153. cpy.set(key[0], self.insert(node.branch(key[0]), key[1:], value))
  154. return cpy
  155. default:
  156. panic(fmt.Sprintf("%T: invalid node: %v", node, node))
  157. }
  158. }
  159. func (self *Trie) get(node Node, key []byte) Node {
  160. if len(key) == 0 {
  161. return node
  162. }
  163. if node == nil {
  164. return nil
  165. }
  166. switch node := node.(type) {
  167. case *ShortNode:
  168. k := node.Key()
  169. cnode := node.Value()
  170. if len(key) >= len(k) && bytes.Equal(k, key[:len(k)]) {
  171. return self.get(cnode, key[len(k):])
  172. }
  173. return nil
  174. case *FullNode:
  175. return self.get(node.branch(key[0]), key[1:])
  176. default:
  177. panic(fmt.Sprintf("%T: invalid node: %v", node, node))
  178. }
  179. }
  180. func (self *Trie) delete(node Node, key []byte) Node {
  181. if len(key) == 0 && node == nil {
  182. return nil
  183. }
  184. switch node := node.(type) {
  185. case *ShortNode:
  186. k := node.Key()
  187. cnode := node.Value()
  188. if bytes.Equal(key, k) {
  189. return nil
  190. } else if bytes.Equal(key[:len(k)], k) {
  191. child := self.delete(cnode, key[len(k):])
  192. var n Node
  193. switch child := child.(type) {
  194. case *ShortNode:
  195. nkey := append(k, child.Key()...)
  196. n = NewShortNode(self, nkey, child.Value())
  197. case *FullNode:
  198. sn := NewShortNode(self, node.Key(), child)
  199. sn.key = node.key
  200. n = sn
  201. }
  202. return n
  203. } else {
  204. return node
  205. }
  206. case *FullNode:
  207. n := node.Copy(self).(*FullNode)
  208. n.set(key[0], self.delete(n.branch(key[0]), key[1:]))
  209. pos := -1
  210. for i := 0; i < 17; i++ {
  211. if n.branch(byte(i)) != nil {
  212. if pos == -1 {
  213. pos = i
  214. } else {
  215. pos = -2
  216. }
  217. }
  218. }
  219. var nnode Node
  220. if pos == 16 {
  221. nnode = NewShortNode(self, []byte{16}, n.branch(byte(pos)))
  222. } else if pos >= 0 {
  223. cnode := n.branch(byte(pos))
  224. switch cnode := cnode.(type) {
  225. case *ShortNode:
  226. // Stitch keys
  227. k := append([]byte{byte(pos)}, cnode.Key()...)
  228. nnode = NewShortNode(self, k, cnode.Value())
  229. case *FullNode:
  230. nnode = NewShortNode(self, []byte{byte(pos)}, n.branch(byte(pos)))
  231. }
  232. } else {
  233. nnode = n
  234. }
  235. return nnode
  236. case nil:
  237. return nil
  238. default:
  239. panic(fmt.Sprintf("%T: invalid node: %v (%v)", node, node, key))
  240. }
  241. }
  242. // casting functions and cache storing
  243. func (self *Trie) mknode(value *ethutil.Value) Node {
  244. l := value.Len()
  245. switch l {
  246. case 0:
  247. return nil
  248. case 2:
  249. // A value node may consists of 2 bytes.
  250. if value.Get(0).Len() != 0 {
  251. return NewShortNode(self, CompactDecode(string(value.Get(0).Bytes())), self.mknode(value.Get(1)))
  252. }
  253. case 17:
  254. fnode := NewFullNode(self)
  255. for i := 0; i < l; i++ {
  256. fnode.set(byte(i), self.mknode(value.Get(i)))
  257. }
  258. return fnode
  259. case 32:
  260. return &HashNode{value.Bytes(), self}
  261. }
  262. return &ValueNode{self, value.Bytes()}
  263. }
  264. func (self *Trie) trans(node Node) Node {
  265. switch node := node.(type) {
  266. case *HashNode:
  267. value := ethutil.NewValueFromBytes(self.cache.Get(node.key))
  268. return self.mknode(value)
  269. default:
  270. return node
  271. }
  272. }
  273. func (self *Trie) store(node Node) interface{} {
  274. data := ethutil.Encode(node)
  275. if len(data) >= 32 {
  276. key := crypto.Sha3(data)
  277. self.cache.Put(key, data)
  278. return key
  279. }
  280. return node.RlpData()
  281. }
  282. func (self *Trie) PrintRoot() {
  283. fmt.Println(self.root)
  284. fmt.Printf("root=%x\n", self.Root())
  285. }