You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

519 lines
13 KiB

10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
  1. package merkle
  2. import (
  3. . "github.com/tendermint/tendermint/binary"
  4. "bytes"
  5. "io"
  6. "crypto/sha256"
  7. )
  8. const HASH_BYTE_SIZE int = 4+32
  9. // Immutable AVL Tree (wraps the Node root)
  10. type IAVLTree struct {
  11. db Db
  12. root *IAVLNode
  13. }
  14. func NewIAVLTree(db Db) *IAVLTree {
  15. return &IAVLTree{db:db, root:nil}
  16. }
  17. func NewIAVLTreeFromHash(db Db, hash ByteSlice) *IAVLTree {
  18. root := &IAVLNode{
  19. hash: hash,
  20. flags: IAVLNODE_FLAG_PERSISTED | IAVLNODE_FLAG_PLACEHOLDER,
  21. }
  22. root.fill(db)
  23. return &IAVLTree{db:db, root:root}
  24. }
  25. func (self *IAVLTree) Root() Node {
  26. return self.root
  27. }
  28. func (self *IAVLTree) Size() uint64 {
  29. if self.root == nil { return 0 }
  30. return self.root.Size()
  31. }
  32. func (self *IAVLTree) Height() uint8 {
  33. if self.root == nil { return 0 }
  34. return self.root.Height()
  35. }
  36. func (self *IAVLTree) Has(key Key) bool {
  37. if self.root == nil { return false }
  38. return self.root.has(self.db, key)
  39. }
  40. func (self *IAVLTree) Put(key Key, value Value) (updated bool) {
  41. if self.root == nil {
  42. self.root = NewIAVLNode(key, value)
  43. return false
  44. }
  45. self.root, updated = self.root.put(self.db, key, value)
  46. return updated
  47. }
  48. func (self *IAVLTree) Hash() (ByteSlice, uint64) {
  49. if self.root == nil { return nil, 0 }
  50. return self.root.Hash()
  51. }
  52. func (self *IAVLTree) Save() {
  53. if self.root == nil { return }
  54. if self.root.hash == nil {
  55. self.root.Hash()
  56. }
  57. self.root.Save(self.db)
  58. }
  59. func (self *IAVLTree) Get(key Key) (value Value) {
  60. if self.root == nil { return nil }
  61. return self.root.get(self.db, key)
  62. }
  63. func (self *IAVLTree) Remove(key Key) (value Value, err error) {
  64. if self.root == nil { return nil, NotFound(key) }
  65. newRoot, _, value, err := self.root.remove(self.db, key)
  66. if err != nil {
  67. return nil, err
  68. }
  69. self.root = newRoot
  70. return value, nil
  71. }
  72. func (self *IAVLTree) Traverse(cb func(Node) bool) {
  73. if self.root == nil { return }
  74. self.root.traverse(self.db, cb)
  75. }
  76. // Node
  77. type IAVLNode struct {
  78. key Key
  79. value Value
  80. size uint64
  81. height uint8
  82. hash ByteSlice
  83. left *IAVLNode
  84. right *IAVLNode
  85. // volatile
  86. flags byte
  87. }
  88. const (
  89. IAVLNODE_FLAG_PERSISTED = byte(0x01)
  90. IAVLNODE_FLAG_PLACEHOLDER = byte(0x02)
  91. )
  92. func NewIAVLNode(key Key, value Value) *IAVLNode {
  93. return &IAVLNode{
  94. key: key,
  95. value: value,
  96. size: 1,
  97. }
  98. }
  99. func (self *IAVLNode) Copy() *IAVLNode {
  100. if self.height == 0 {
  101. panic("Why are you copying a value node?")
  102. }
  103. return &IAVLNode{
  104. key: self.key,
  105. size: self.size,
  106. height: self.height,
  107. left: self.left,
  108. right: self.right,
  109. hash: nil,
  110. flags: byte(0),
  111. }
  112. }
  113. func (self *IAVLNode) Equals(other Binary) bool {
  114. if o, ok := other.(*IAVLNode); ok {
  115. return self.hash.Equals(o.hash)
  116. } else {
  117. return false
  118. }
  119. }
  120. func (self *IAVLNode) Key() Key {
  121. return self.key
  122. }
  123. func (self *IAVLNode) Value() Value {
  124. return self.value
  125. }
  126. func (self *IAVLNode) Size() uint64 {
  127. return self.size
  128. }
  129. func (self *IAVLNode) Height() uint8 {
  130. return self.height
  131. }
  132. func (self *IAVLNode) has(db Db, key Key) (has bool) {
  133. if self.key.Equals(key) {
  134. return true
  135. }
  136. if self.height == 0 {
  137. return false
  138. } else {
  139. if key.Less(self.key) {
  140. return self.leftFilled(db).has(db, key)
  141. } else {
  142. return self.rightFilled(db).has(db, key)
  143. }
  144. }
  145. }
  146. func (self *IAVLNode) get(db Db, key Key) (value Value) {
  147. if self.height == 0 {
  148. if self.key.Equals(key) {
  149. return self.value
  150. } else {
  151. return nil
  152. }
  153. } else {
  154. if key.Less(self.key) {
  155. return self.leftFilled(db).get(db, key)
  156. } else {
  157. return self.rightFilled(db).get(db, key)
  158. }
  159. }
  160. }
  161. func (self *IAVLNode) Hash() (ByteSlice, uint64) {
  162. if self.hash != nil {
  163. return self.hash, 0
  164. }
  165. hasher := sha256.New()
  166. _, hashCount, err := self.saveToCountHashes(hasher, false)
  167. if err != nil { panic(err) }
  168. self.hash = hasher.Sum(nil)
  169. return self.hash, hashCount+1
  170. }
  171. func (self *IAVLNode) Save(db Db) {
  172. if self.hash == nil {
  173. panic("savee.hash can't be nil")
  174. }
  175. if self.flags & IAVLNODE_FLAG_PERSISTED > 0 ||
  176. self.flags & IAVLNODE_FLAG_PLACEHOLDER > 0 {
  177. return
  178. }
  179. // children
  180. if self.height > 0 {
  181. self.left.Save(db)
  182. self.right.Save(db)
  183. }
  184. // save self
  185. buf := make([]byte, 0, self.ByteSize())
  186. n, err := self.WriteTo(bytes.NewBuffer(buf))
  187. if err != nil { panic(err) }
  188. if n != int64(cap(buf)) { panic("unexpected write length") }
  189. db.Put([]byte(self.hash), buf[0:cap(buf)])
  190. self.flags |= IAVLNODE_FLAG_PERSISTED
  191. }
  192. func (self *IAVLNode) put(db Db, key Key, value Value) (_ *IAVLNode, updated bool) {
  193. if self.height == 0 {
  194. if key.Less(self.key) {
  195. return &IAVLNode{
  196. key: self.key,
  197. height: 1,
  198. size: 2,
  199. left: NewIAVLNode(key, value),
  200. right: self,
  201. }, false
  202. } else if self.key.Equals(key) {
  203. return NewIAVLNode(key, value), true
  204. } else {
  205. return &IAVLNode{
  206. key: key,
  207. height: 1,
  208. size: 2,
  209. left: self,
  210. right: NewIAVLNode(key, value),
  211. }, false
  212. }
  213. } else {
  214. self = self.Copy()
  215. if key.Less(self.key) {
  216. self.left, updated = self.leftFilled(db).put(db, key, value)
  217. } else {
  218. self.right, updated = self.rightFilled(db).put(db, key, value)
  219. }
  220. if updated {
  221. return self, updated
  222. } else {
  223. self.calcHeightAndSize(db)
  224. return self.balance(db), updated
  225. }
  226. }
  227. }
  228. // newKey: new leftmost leaf key for tree after successfully removing 'key' if changed.
  229. func (self *IAVLNode) remove(db Db, key Key) (newSelf *IAVLNode, newKey Key, value Value, err error) {
  230. if self.height == 0 {
  231. if self.key.Equals(key) {
  232. return nil, nil, self.value, nil
  233. } else {
  234. return self, nil, nil, NotFound(key)
  235. }
  236. } else {
  237. if key.Less(self.key) {
  238. var newLeft *IAVLNode
  239. newLeft, newKey, value, err = self.leftFilled(db).remove(db, key)
  240. if err != nil {
  241. return self, nil, value, err
  242. } else if newLeft == nil { // left node held value, was removed
  243. return self.right, self.key, value, nil
  244. }
  245. self = self.Copy()
  246. self.left = newLeft
  247. } else {
  248. var newRight *IAVLNode
  249. newRight, newKey, value, err = self.rightFilled(db).remove(db, key)
  250. if err != nil {
  251. return self, nil, value, err
  252. } else if newRight == nil { // right node held value, was removed
  253. return self.left, nil, value, nil
  254. }
  255. self = self.Copy()
  256. self.right = newRight
  257. if newKey != nil {
  258. self.key = newKey
  259. newKey = nil
  260. }
  261. }
  262. self.calcHeightAndSize(db)
  263. return self.balance(db), newKey, value, err
  264. }
  265. }
  266. func (self *IAVLNode) ByteSize() int {
  267. // 1 byte node height
  268. // 8 bytes node size
  269. size := 9
  270. // key
  271. size += 1 // type info
  272. size += self.key.ByteSize()
  273. if self.height == 0 {
  274. // value
  275. size += 1 // type info
  276. if self.value != nil {
  277. size += self.value.ByteSize()
  278. }
  279. } else {
  280. // children
  281. size += HASH_BYTE_SIZE
  282. size += HASH_BYTE_SIZE
  283. }
  284. return size
  285. }
  286. func (self *IAVLNode) WriteTo(w io.Writer) (n int64, err error) {
  287. n, _, err = self.saveToCountHashes(w, true)
  288. return
  289. }
  290. func (self *IAVLNode) saveToCountHashes(w io.Writer, meta bool) (n int64, hashCount uint64, err error) {
  291. var _n int64
  292. if meta {
  293. // height & size
  294. _n, err = UInt8(self.height).WriteTo(w)
  295. if err != nil { return } else { n += _n }
  296. _n, err = UInt64(self.size).WriteTo(w)
  297. if err != nil { return } else { n += _n }
  298. // key
  299. _n, err = Byte(GetBinaryType(self.key)).WriteTo(w)
  300. if err != nil { return } else { n += _n }
  301. _n, err = self.key.WriteTo(w)
  302. if err != nil { return } else { n += _n }
  303. }
  304. if self.height == 0 {
  305. // value
  306. _n, err = Byte(GetBinaryType(self.value)).WriteTo(w)
  307. if err != nil { return } else { n += _n }
  308. if self.value != nil {
  309. _n, err = self.value.WriteTo(w)
  310. if err != nil { return } else { n += _n }
  311. }
  312. } else {
  313. // left
  314. leftHash, leftCount := self.left.Hash()
  315. hashCount += leftCount
  316. _n, err = leftHash.WriteTo(w)
  317. if err != nil { return } else { n += _n }
  318. // right
  319. rightHash, rightCount := self.right.Hash()
  320. hashCount += rightCount
  321. _n, err = rightHash.WriteTo(w)
  322. if err != nil { return } else { n += _n }
  323. }
  324. return
  325. }
  326. // Given a placeholder node which has only the hash set,
  327. // load the rest of the data from db.
  328. // Not threadsafe.
  329. func (self *IAVLNode) fill(db Db) {
  330. if self.hash == nil {
  331. panic("placeholder.hash can't be nil")
  332. }
  333. buf := db.Get(self.hash)
  334. cur := 0
  335. // node header
  336. self.height = uint8(ReadUInt8(buf[0:]))
  337. self.size = uint64(ReadUInt64(buf[1:]))
  338. // key
  339. key, cur := ReadBinary(buf, 9)
  340. self.key = key.(Key)
  341. if self.height == 0 {
  342. // value
  343. self.value, cur = ReadBinary(buf, cur)
  344. } else {
  345. // left
  346. var leftHash ByteSlice
  347. leftHash, cur = ReadByteSlice(buf, cur)
  348. self.left = &IAVLNode{
  349. hash: leftHash,
  350. flags: IAVLNODE_FLAG_PERSISTED | IAVLNODE_FLAG_PLACEHOLDER,
  351. }
  352. // right
  353. var rightHash ByteSlice
  354. rightHash, cur = ReadByteSlice(buf, cur)
  355. self.right = &IAVLNode{
  356. hash: rightHash,
  357. flags: IAVLNODE_FLAG_PERSISTED | IAVLNODE_FLAG_PLACEHOLDER,
  358. }
  359. if cur != len(buf) {
  360. panic("buf not all consumed")
  361. }
  362. }
  363. self.flags &= ^IAVLNODE_FLAG_PLACEHOLDER
  364. }
  365. func (self *IAVLNode) leftFilled(db Db) *IAVLNode {
  366. if self.left.flags & IAVLNODE_FLAG_PLACEHOLDER > 0 {
  367. self.left.fill(db)
  368. }
  369. return self.left
  370. }
  371. func (self *IAVLNode) rightFilled(db Db) *IAVLNode {
  372. if self.right.flags & IAVLNODE_FLAG_PLACEHOLDER > 0 {
  373. self.right.fill(db)
  374. }
  375. return self.right
  376. }
  377. func (self *IAVLNode) rotateRight(db Db) *IAVLNode {
  378. self = self.Copy()
  379. sl := self.leftFilled(db).Copy()
  380. slr := sl.right
  381. sl.right = self
  382. self.left = slr
  383. self.calcHeightAndSize(db)
  384. sl.calcHeightAndSize(db)
  385. return sl
  386. }
  387. func (self *IAVLNode) rotateLeft(db Db) *IAVLNode {
  388. self = self.Copy()
  389. sr := self.rightFilled(db).Copy()
  390. srl := sr.left
  391. sr.left = self
  392. self.right = srl
  393. self.calcHeightAndSize(db)
  394. sr.calcHeightAndSize(db)
  395. return sr
  396. }
  397. func (self *IAVLNode) calcHeightAndSize(db Db) {
  398. self.height = maxUint8(self.leftFilled(db).Height(), self.rightFilled(db).Height()) + 1
  399. self.size = self.leftFilled(db).Size() + self.rightFilled(db).Size()
  400. }
  401. func (self *IAVLNode) calcBalance(db Db) int {
  402. return int(self.leftFilled(db).Height()) - int(self.rightFilled(db).Height())
  403. }
  404. func (self *IAVLNode) balance(db Db) (newSelf *IAVLNode) {
  405. balance := self.calcBalance(db)
  406. if (balance > 1) {
  407. if (self.leftFilled(db).calcBalance(db) >= 0) {
  408. // Left Left Case
  409. return self.rotateRight(db)
  410. } else {
  411. // Left Right Case
  412. self = self.Copy()
  413. self.left = self.leftFilled(db).rotateLeft(db)
  414. //self.calcHeightAndSize()
  415. return self.rotateRight(db)
  416. }
  417. }
  418. if (balance < -1) {
  419. if (self.rightFilled(db).calcBalance(db) <= 0) {
  420. // Right Right Case
  421. return self.rotateLeft(db)
  422. } else {
  423. // Right Left Case
  424. self = self.Copy()
  425. self.right = self.rightFilled(db).rotateRight(db)
  426. //self.calcHeightAndSize()
  427. return self.rotateLeft(db)
  428. }
  429. }
  430. // Nothing changed
  431. return self
  432. }
  433. func (self *IAVLNode) lmd(db Db) (*IAVLNode) {
  434. if self.height == 0 {
  435. return self
  436. }
  437. return self.leftFilled(db).lmd(db)
  438. }
  439. func (self *IAVLNode) rmd(db Db) (*IAVLNode) {
  440. if self.height == 0 {
  441. return self
  442. }
  443. return self.rightFilled(db).rmd(db)
  444. }
  445. func (self *IAVLNode) traverse(db Db, cb func(Node)bool) bool {
  446. stop := cb(self)
  447. if stop { return stop }
  448. if self.height > 0 {
  449. stop = self.leftFilled(db).traverse(db, cb)
  450. if stop { return stop }
  451. stop = self.rightFilled(db).traverse(db, cb)
  452. if stop { return stop }
  453. }
  454. return false
  455. }