trie.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. // Copyright 2014 The go-ethereum Authors
  2. // This file is part of go-ethereum.
  3. //
  4. // go-ethereum is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // go-ethereum is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
  16. package trie
  17. import (
  18. "bytes"
  19. "container/list"
  20. "fmt"
  21. "sync"
  22. "github.com/ethereum/go-ethereum/common"
  23. "github.com/ethereum/go-ethereum/crypto"
  24. )
  25. func ParanoiaCheck(t1 *Trie, backend Backend) (bool, *Trie) {
  26. t2 := New(nil, backend)
  27. it := t1.Iterator()
  28. for it.Next() {
  29. t2.Update(it.Key, it.Value)
  30. }
  31. return bytes.Equal(t2.Hash(), t1.Hash()), t2
  32. }
  33. type Trie struct {
  34. mu sync.Mutex
  35. root Node
  36. roothash []byte
  37. cache *Cache
  38. revisions *list.List
  39. }
  40. func New(root []byte, backend Backend) *Trie {
  41. trie := &Trie{}
  42. trie.revisions = list.New()
  43. trie.roothash = root
  44. if backend != nil {
  45. trie.cache = NewCache(backend)
  46. }
  47. if root != nil {
  48. value := common.NewValueFromBytes(trie.cache.Get(root))
  49. trie.root = trie.mknode(value)
  50. }
  51. return trie
  52. }
  53. func (self *Trie) Iterator() *Iterator {
  54. return NewIterator(self)
  55. }
  56. func (self *Trie) Copy() *Trie {
  57. cpy := make([]byte, 32)
  58. copy(cpy, self.roothash)
  59. trie := New(nil, nil)
  60. trie.cache = self.cache.Copy()
  61. if self.root != nil {
  62. trie.root = self.root.Copy(trie)
  63. }
  64. return trie
  65. }
  66. // Legacy support
  67. func (self *Trie) Root() []byte { return self.Hash() }
  68. func (self *Trie) Hash() []byte {
  69. var hash []byte
  70. if self.root != nil {
  71. t := self.root.Hash()
  72. if byts, ok := t.([]byte); ok && len(byts) > 0 {
  73. hash = byts
  74. } else {
  75. hash = crypto.Sha3(common.Encode(self.root.RlpData()))
  76. }
  77. } else {
  78. hash = crypto.Sha3(common.Encode(""))
  79. }
  80. if !bytes.Equal(hash, self.roothash) {
  81. self.revisions.PushBack(self.roothash)
  82. self.roothash = hash
  83. }
  84. return hash
  85. }
  86. func (self *Trie) Commit() {
  87. self.mu.Lock()
  88. defer self.mu.Unlock()
  89. // Hash first
  90. self.Hash()
  91. self.cache.Flush()
  92. }
  93. // Reset should only be called if the trie has been hashed
  94. func (self *Trie) Reset() {
  95. self.mu.Lock()
  96. defer self.mu.Unlock()
  97. self.cache.Reset()
  98. if self.revisions.Len() > 0 {
  99. revision := self.revisions.Remove(self.revisions.Back()).([]byte)
  100. self.roothash = revision
  101. }
  102. value := common.NewValueFromBytes(self.cache.Get(self.roothash))
  103. self.root = self.mknode(value)
  104. }
  105. func (self *Trie) UpdateString(key, value string) Node { return self.Update([]byte(key), []byte(value)) }
  106. func (self *Trie) Update(key, value []byte) Node {
  107. self.mu.Lock()
  108. defer self.mu.Unlock()
  109. k := CompactHexDecode(string(key))
  110. if len(value) != 0 {
  111. node := NewValueNode(self, value)
  112. node.dirty = true
  113. self.root = self.insert(self.root, k, node)
  114. } else {
  115. self.root = self.delete(self.root, k)
  116. }
  117. return self.root
  118. }
  119. func (self *Trie) GetString(key string) []byte { return self.Get([]byte(key)) }
  120. func (self *Trie) Get(key []byte) []byte {
  121. self.mu.Lock()
  122. defer self.mu.Unlock()
  123. k := CompactHexDecode(string(key))
  124. n := self.get(self.root, k)
  125. if n != nil {
  126. return n.(*ValueNode).Val()
  127. }
  128. return nil
  129. }
  130. func (self *Trie) DeleteString(key string) Node { return self.Delete([]byte(key)) }
  131. func (self *Trie) Delete(key []byte) Node {
  132. self.mu.Lock()
  133. defer self.mu.Unlock()
  134. k := CompactHexDecode(string(key))
  135. self.root = self.delete(self.root, k)
  136. return self.root
  137. }
  138. func (self *Trie) insert(node Node, key []byte, value Node) Node {
  139. if len(key) == 0 {
  140. return value
  141. }
  142. if node == nil {
  143. node := NewShortNode(self, key, value)
  144. node.dirty = true
  145. return node
  146. }
  147. switch node := node.(type) {
  148. case *ShortNode:
  149. k := node.Key()
  150. cnode := node.Value()
  151. if bytes.Equal(k, key) {
  152. node := NewShortNode(self, key, value)
  153. node.dirty = true
  154. return node
  155. }
  156. var n Node
  157. matchlength := MatchingNibbleLength(key, k)
  158. if matchlength == len(k) {
  159. n = self.insert(cnode, key[matchlength:], value)
  160. } else {
  161. pnode := self.insert(nil, k[matchlength+1:], cnode)
  162. nnode := self.insert(nil, key[matchlength+1:], value)
  163. fulln := NewFullNode(self)
  164. fulln.dirty = true
  165. fulln.set(k[matchlength], pnode)
  166. fulln.set(key[matchlength], nnode)
  167. n = fulln
  168. }
  169. if matchlength == 0 {
  170. return n
  171. }
  172. snode := NewShortNode(self, key[:matchlength], n)
  173. snode.dirty = true
  174. return snode
  175. case *FullNode:
  176. cpy := node.Copy(self).(*FullNode)
  177. cpy.set(key[0], self.insert(node.branch(key[0]), key[1:], value))
  178. cpy.dirty = true
  179. return cpy
  180. default:
  181. panic(fmt.Sprintf("%T: invalid node: %v", node, node))
  182. }
  183. }
  184. func (self *Trie) get(node Node, key []byte) Node {
  185. if len(key) == 0 {
  186. return node
  187. }
  188. if node == nil {
  189. return nil
  190. }
  191. switch node := node.(type) {
  192. case *ShortNode:
  193. k := node.Key()
  194. cnode := node.Value()
  195. if len(key) >= len(k) && bytes.Equal(k, key[:len(k)]) {
  196. return self.get(cnode, key[len(k):])
  197. }
  198. return nil
  199. case *FullNode:
  200. return self.get(node.branch(key[0]), key[1:])
  201. default:
  202. panic(fmt.Sprintf("%T: invalid node: %v", node, node))
  203. }
  204. }
  205. func (self *Trie) delete(node Node, key []byte) Node {
  206. if len(key) == 0 && node == nil {
  207. return nil
  208. }
  209. switch node := node.(type) {
  210. case *ShortNode:
  211. k := node.Key()
  212. cnode := node.Value()
  213. if bytes.Equal(key, k) {
  214. return nil
  215. } else if bytes.Equal(key[:len(k)], k) {
  216. child := self.delete(cnode, key[len(k):])
  217. var n Node
  218. switch child := child.(type) {
  219. case *ShortNode:
  220. nkey := append(k, child.Key()...)
  221. n = NewShortNode(self, nkey, child.Value())
  222. n.(*ShortNode).dirty = true
  223. case *FullNode:
  224. sn := NewShortNode(self, node.Key(), child)
  225. sn.dirty = true
  226. sn.key = node.key
  227. n = sn
  228. }
  229. return n
  230. } else {
  231. return node
  232. }
  233. case *FullNode:
  234. n := node.Copy(self).(*FullNode)
  235. n.set(key[0], self.delete(n.branch(key[0]), key[1:]))
  236. n.dirty = true
  237. pos := -1
  238. for i := 0; i < 17; i++ {
  239. if n.branch(byte(i)) != nil {
  240. if pos == -1 {
  241. pos = i
  242. } else {
  243. pos = -2
  244. }
  245. }
  246. }
  247. var nnode Node
  248. if pos == 16 {
  249. nnode = NewShortNode(self, []byte{16}, n.branch(byte(pos)))
  250. nnode.(*ShortNode).dirty = true
  251. } else if pos >= 0 {
  252. cnode := n.branch(byte(pos))
  253. switch cnode := cnode.(type) {
  254. case *ShortNode:
  255. // Stitch keys
  256. k := append([]byte{byte(pos)}, cnode.Key()...)
  257. nnode = NewShortNode(self, k, cnode.Value())
  258. nnode.(*ShortNode).dirty = true
  259. case *FullNode:
  260. nnode = NewShortNode(self, []byte{byte(pos)}, n.branch(byte(pos)))
  261. nnode.(*ShortNode).dirty = true
  262. }
  263. } else {
  264. nnode = n
  265. }
  266. return nnode
  267. case nil:
  268. return nil
  269. default:
  270. panic(fmt.Sprintf("%T: invalid node: %v (%v)", node, node, key))
  271. }
  272. }
  273. // casting functions and cache storing
  274. func (self *Trie) mknode(value *common.Value) Node {
  275. l := value.Len()
  276. switch l {
  277. case 0:
  278. return nil
  279. case 2:
  280. // A value node may consists of 2 bytes.
  281. if value.Get(0).Len() != 0 {
  282. key := CompactDecode(string(value.Get(0).Bytes()))
  283. if key[len(key)-1] == 16 {
  284. return NewShortNode(self, key, NewValueNode(self, value.Get(1).Bytes()))
  285. } else {
  286. return NewShortNode(self, key, self.mknode(value.Get(1)))
  287. }
  288. }
  289. case 17:
  290. if len(value.Bytes()) != 17 {
  291. fnode := NewFullNode(self)
  292. for i := 0; i < 16; i++ {
  293. fnode.set(byte(i), self.mknode(value.Get(i)))
  294. }
  295. return fnode
  296. }
  297. case 32:
  298. return NewHash(value.Bytes(), self)
  299. }
  300. return NewValueNode(self, value.Bytes())
  301. }
  302. func (self *Trie) trans(node Node) Node {
  303. switch node := node.(type) {
  304. case *HashNode:
  305. value := common.NewValueFromBytes(self.cache.Get(node.key))
  306. return self.mknode(value)
  307. default:
  308. return node
  309. }
  310. }
  311. func (self *Trie) store(node Node) interface{} {
  312. data := common.Encode(node)
  313. if len(data) >= 32 {
  314. key := crypto.Sha3(data)
  315. if node.Dirty() {
  316. //fmt.Println("save", node)
  317. //fmt.Println()
  318. self.cache.Put(key, data)
  319. }
  320. return key
  321. }
  322. return node.RlpData()
  323. }
  324. func (self *Trie) PrintRoot() {
  325. fmt.Println(self.root)
  326. fmt.Printf("root=%x\n", self.Root())
  327. }