trie.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. package trie
  2. import (
  3. "bytes"
  4. "container/list"
  5. "fmt"
  6. "sync"
  7. "github.com/ethereum/go-ethereum/common"
  8. "github.com/ethereum/go-ethereum/crypto"
  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 := common.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(common.Encode(self.root.RlpData()))
  61. }
  62. } else {
  63. hash = crypto.Sha3(common.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 := common.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. node := NewValueNode(self, value)
  97. node.dirty = true
  98. self.root = self.insert(self.root, k, node)
  99. } else {
  100. self.root = self.delete(self.root, k)
  101. }
  102. return self.root
  103. }
  104. func (self *Trie) GetString(key string) []byte { return self.Get([]byte(key)) }
  105. func (self *Trie) Get(key []byte) []byte {
  106. self.mu.Lock()
  107. defer self.mu.Unlock()
  108. k := CompactHexDecode(string(key))
  109. n := self.get(self.root, k)
  110. if n != nil {
  111. return n.(*ValueNode).Val()
  112. }
  113. return nil
  114. }
  115. func (self *Trie) DeleteString(key string) Node { return self.Delete([]byte(key)) }
  116. func (self *Trie) Delete(key []byte) Node {
  117. self.mu.Lock()
  118. defer self.mu.Unlock()
  119. k := CompactHexDecode(string(key))
  120. self.root = self.delete(self.root, k)
  121. return self.root
  122. }
  123. func (self *Trie) insert(node Node, key []byte, value Node) Node {
  124. if len(key) == 0 {
  125. return value
  126. }
  127. if node == nil {
  128. node := NewShortNode(self, key, value)
  129. node.dirty = true
  130. return node
  131. }
  132. switch node := node.(type) {
  133. case *ShortNode:
  134. k := node.Key()
  135. cnode := node.Value()
  136. if bytes.Equal(k, key) {
  137. node := NewShortNode(self, key, value)
  138. node.dirty = true
  139. return node
  140. }
  141. var n Node
  142. matchlength := MatchingNibbleLength(key, k)
  143. if matchlength == len(k) {
  144. n = self.insert(cnode, key[matchlength:], value)
  145. } else {
  146. pnode := self.insert(nil, k[matchlength+1:], cnode)
  147. nnode := self.insert(nil, key[matchlength+1:], value)
  148. fulln := NewFullNode(self)
  149. fulln.dirty = true
  150. fulln.set(k[matchlength], pnode)
  151. fulln.set(key[matchlength], nnode)
  152. n = fulln
  153. }
  154. if matchlength == 0 {
  155. return n
  156. }
  157. snode := NewShortNode(self, key[:matchlength], n)
  158. snode.dirty = true
  159. return snode
  160. case *FullNode:
  161. cpy := node.Copy(self).(*FullNode)
  162. cpy.set(key[0], self.insert(node.branch(key[0]), key[1:], value))
  163. cpy.dirty = true
  164. return cpy
  165. default:
  166. panic(fmt.Sprintf("%T: invalid node: %v", node, node))
  167. }
  168. }
  169. func (self *Trie) get(node Node, key []byte) Node {
  170. if len(key) == 0 {
  171. return node
  172. }
  173. if node == nil {
  174. return nil
  175. }
  176. switch node := node.(type) {
  177. case *ShortNode:
  178. k := node.Key()
  179. cnode := node.Value()
  180. if len(key) >= len(k) && bytes.Equal(k, key[:len(k)]) {
  181. return self.get(cnode, key[len(k):])
  182. }
  183. return nil
  184. case *FullNode:
  185. return self.get(node.branch(key[0]), key[1:])
  186. default:
  187. panic(fmt.Sprintf("%T: invalid node: %v", node, node))
  188. }
  189. }
  190. func (self *Trie) delete(node Node, key []byte) Node {
  191. if len(key) == 0 && node == nil {
  192. return nil
  193. }
  194. switch node := node.(type) {
  195. case *ShortNode:
  196. k := node.Key()
  197. cnode := node.Value()
  198. if bytes.Equal(key, k) {
  199. return nil
  200. } else if bytes.Equal(key[:len(k)], k) {
  201. child := self.delete(cnode, key[len(k):])
  202. var n Node
  203. switch child := child.(type) {
  204. case *ShortNode:
  205. nkey := append(k, child.Key()...)
  206. n = NewShortNode(self, nkey, child.Value())
  207. n.(*ShortNode).dirty = true
  208. case *FullNode:
  209. sn := NewShortNode(self, node.Key(), child)
  210. sn.dirty = true
  211. sn.key = node.key
  212. n = sn
  213. }
  214. return n
  215. } else {
  216. return node
  217. }
  218. case *FullNode:
  219. n := node.Copy(self).(*FullNode)
  220. n.set(key[0], self.delete(n.branch(key[0]), key[1:]))
  221. n.dirty = true
  222. pos := -1
  223. for i := 0; i < 17; i++ {
  224. if n.branch(byte(i)) != nil {
  225. if pos == -1 {
  226. pos = i
  227. } else {
  228. pos = -2
  229. }
  230. }
  231. }
  232. var nnode Node
  233. if pos == 16 {
  234. nnode = NewShortNode(self, []byte{16}, n.branch(byte(pos)))
  235. nnode.(*ShortNode).dirty = true
  236. } else if pos >= 0 {
  237. cnode := n.branch(byte(pos))
  238. switch cnode := cnode.(type) {
  239. case *ShortNode:
  240. // Stitch keys
  241. k := append([]byte{byte(pos)}, cnode.Key()...)
  242. nnode = NewShortNode(self, k, cnode.Value())
  243. nnode.(*ShortNode).dirty = true
  244. case *FullNode:
  245. nnode = NewShortNode(self, []byte{byte(pos)}, n.branch(byte(pos)))
  246. nnode.(*ShortNode).dirty = true
  247. }
  248. } else {
  249. nnode = n
  250. }
  251. return nnode
  252. case nil:
  253. return nil
  254. default:
  255. panic(fmt.Sprintf("%T: invalid node: %v (%v)", node, node, key))
  256. }
  257. }
  258. // casting functions and cache storing
  259. func (self *Trie) mknode(value *common.Value) Node {
  260. l := value.Len()
  261. switch l {
  262. case 0:
  263. return nil
  264. case 2:
  265. // A value node may consists of 2 bytes.
  266. if value.Get(0).Len() != 0 {
  267. key := CompactDecode(string(value.Get(0).Bytes()))
  268. if key[len(key)-1] == 16 {
  269. return NewShortNode(self, key, NewValueNode(self, value.Get(1).Bytes()))
  270. } else {
  271. return NewShortNode(self, key, self.mknode(value.Get(1)))
  272. }
  273. }
  274. case 17:
  275. if len(value.Bytes()) != 17 {
  276. fnode := NewFullNode(self)
  277. for i := 0; i < 16; i++ {
  278. fnode.set(byte(i), self.mknode(value.Get(i)))
  279. }
  280. return fnode
  281. }
  282. case 32:
  283. return NewHash(value.Bytes(), self)
  284. }
  285. return NewValueNode(self, value.Bytes())
  286. }
  287. func (self *Trie) trans(node Node) Node {
  288. switch node := node.(type) {
  289. case *HashNode:
  290. value := common.NewValueFromBytes(self.cache.Get(node.key))
  291. return self.mknode(value)
  292. default:
  293. return node
  294. }
  295. }
  296. func (self *Trie) store(node Node) interface{} {
  297. data := common.Encode(node)
  298. if len(data) >= 32 {
  299. key := crypto.Sha3(data)
  300. if node.Dirty() {
  301. //fmt.Println("save", node)
  302. //fmt.Println()
  303. self.cache.Put(key, data)
  304. }
  305. return key
  306. }
  307. return node.RlpData()
  308. }
  309. func (self *Trie) PrintRoot() {
  310. fmt.Println(self.root)
  311. fmt.Printf("root=%x\n", self.Root())
  312. }