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.

398 lines
8.3 KiB

10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
11 years ago
10 years ago
11 years ago
10 years ago
11 years ago
10 years ago
11 years ago
11 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
11 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
11 years ago
10 years ago
11 years ago
11 years ago
10 years ago
11 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
11 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
  1. package merkle
  2. import (
  3. "bytes"
  4. "crypto/sha256"
  5. . "github.com/tendermint/tendermint/binary"
  6. "io"
  7. )
  8. // Node
  9. type IAVLNode struct {
  10. key []byte
  11. value []byte
  12. size uint64
  13. height uint8
  14. hash []byte
  15. left *IAVLNode
  16. right *IAVLNode
  17. // volatile
  18. flags byte
  19. }
  20. const (
  21. IAVLNODE_FLAG_PERSISTED = byte(0x01)
  22. IAVLNODE_FLAG_PLACEHOLDER = byte(0x02)
  23. )
  24. func NewIAVLNode(key []byte, value []byte) *IAVLNode {
  25. return &IAVLNode{
  26. key: key,
  27. value: value,
  28. size: 1,
  29. }
  30. }
  31. func (self *IAVLNode) Copy() *IAVLNode {
  32. if self.height == 0 {
  33. panic("Why are you copying a value node?")
  34. }
  35. return &IAVLNode{
  36. key: self.key,
  37. size: self.size,
  38. height: self.height,
  39. left: self.left,
  40. right: self.right,
  41. hash: nil,
  42. flags: byte(0),
  43. }
  44. }
  45. func (self *IAVLNode) Size() uint64 {
  46. return self.size
  47. }
  48. func (self *IAVLNode) Height() uint8 {
  49. return self.height
  50. }
  51. func (self *IAVLNode) has(db Db, key []byte) (has bool) {
  52. if bytes.Equal(self.key, key) {
  53. return true
  54. }
  55. if self.height == 0 {
  56. return false
  57. } else {
  58. if bytes.Compare(key, self.key) == -1 {
  59. return self.leftFilled(db).has(db, key)
  60. } else {
  61. return self.rightFilled(db).has(db, key)
  62. }
  63. }
  64. }
  65. func (self *IAVLNode) get(db Db, key []byte) (value []byte) {
  66. if self.height == 0 {
  67. if bytes.Equal(self.key, key) {
  68. return self.value
  69. } else {
  70. return nil
  71. }
  72. } else {
  73. if bytes.Compare(key, self.key) == -1 {
  74. return self.leftFilled(db).get(db, key)
  75. } else {
  76. return self.rightFilled(db).get(db, key)
  77. }
  78. }
  79. }
  80. func (self *IAVLNode) HashWithCount() ([]byte, uint64) {
  81. if self.hash != nil {
  82. return self.hash, 0
  83. }
  84. hasher := sha256.New()
  85. _, hashCount, err := self.saveToCountHashes(hasher)
  86. if err != nil {
  87. panic(err)
  88. }
  89. self.hash = hasher.Sum(nil)
  90. return self.hash, hashCount + 1
  91. }
  92. func (self *IAVLNode) Save(db Db) {
  93. if self.hash == nil {
  94. panic("savee.hash can't be nil")
  95. }
  96. if self.flags&IAVLNODE_FLAG_PERSISTED > 0 ||
  97. self.flags&IAVLNODE_FLAG_PLACEHOLDER > 0 {
  98. return
  99. }
  100. // children
  101. if self.height > 0 {
  102. self.left.Save(db)
  103. self.right.Save(db)
  104. }
  105. // save self
  106. buf := bytes.NewBuffer(nil)
  107. _, err := self.WriteTo(buf)
  108. if err != nil {
  109. panic(err)
  110. }
  111. db.Set([]byte(self.hash), buf.Bytes())
  112. self.flags |= IAVLNODE_FLAG_PERSISTED
  113. }
  114. func (self *IAVLNode) set(db Db, key []byte, value []byte) (_ *IAVLNode, updated bool) {
  115. if self.height == 0 {
  116. if bytes.Compare(key, self.key) == -1 {
  117. return &IAVLNode{
  118. key: self.key,
  119. height: 1,
  120. size: 2,
  121. left: NewIAVLNode(key, value),
  122. right: self,
  123. }, false
  124. } else if bytes.Equal(self.key, key) {
  125. return NewIAVLNode(key, value), true
  126. } else {
  127. return &IAVLNode{
  128. key: key,
  129. height: 1,
  130. size: 2,
  131. left: self,
  132. right: NewIAVLNode(key, value),
  133. }, false
  134. }
  135. } else {
  136. self = self.Copy()
  137. if bytes.Compare(key, self.key) == -1 {
  138. self.left, updated = self.leftFilled(db).set(db, key, value)
  139. } else {
  140. self.right, updated = self.rightFilled(db).set(db, key, value)
  141. }
  142. if updated {
  143. return self, updated
  144. } else {
  145. self.calcHeightAndSize(db)
  146. return self.balance(db), updated
  147. }
  148. }
  149. }
  150. // newKey: new leftmost leaf key for tree after successfully removing 'key' if changed.
  151. func (self *IAVLNode) remove(db Db, key []byte) (newSelf *IAVLNode, newKey []byte, value []byte, err error) {
  152. if self.height == 0 {
  153. if bytes.Equal(self.key, key) {
  154. return nil, nil, self.value, nil
  155. } else {
  156. return self, nil, nil, NotFound(key)
  157. }
  158. } else {
  159. if bytes.Compare(key, self.key) == -1 {
  160. var newLeft *IAVLNode
  161. newLeft, newKey, value, err = self.leftFilled(db).remove(db, key)
  162. if err != nil {
  163. return self, nil, value, err
  164. } else if newLeft == nil { // left node held value, was removed
  165. return self.right, self.key, value, nil
  166. }
  167. self = self.Copy()
  168. self.left = newLeft
  169. } else {
  170. var newRight *IAVLNode
  171. newRight, newKey, value, err = self.rightFilled(db).remove(db, key)
  172. if err != nil {
  173. return self, nil, value, err
  174. } else if newRight == nil { // right node held value, was removed
  175. return self.left, nil, value, nil
  176. }
  177. self = self.Copy()
  178. self.right = newRight
  179. if newKey != nil {
  180. self.key = newKey
  181. newKey = nil
  182. }
  183. }
  184. self.calcHeightAndSize(db)
  185. return self.balance(db), newKey, value, err
  186. }
  187. }
  188. func (self *IAVLNode) WriteTo(w io.Writer) (n int64, err error) {
  189. n, _, err = self.saveToCountHashes(w)
  190. return
  191. }
  192. func (self *IAVLNode) saveToCountHashes(w io.Writer) (n int64, hashCount uint64, err error) {
  193. // height & size & key
  194. WriteUInt8(w, self.height, &n, &err)
  195. WriteUInt64(w, self.size, &n, &err)
  196. WriteByteSlice(w, self.key, &n, &err)
  197. if err != nil {
  198. return
  199. }
  200. // value or children
  201. if self.height == 0 {
  202. // value
  203. WriteByteSlice(w, self.value, &n, &err)
  204. } else {
  205. // left
  206. leftHash, leftCount := self.left.HashWithCount()
  207. hashCount += leftCount
  208. WriteByteSlice(w, leftHash, &n, &err)
  209. // right
  210. rightHash, rightCount := self.right.HashWithCount()
  211. hashCount += rightCount
  212. WriteByteSlice(w, rightHash, &n, &err)
  213. }
  214. return
  215. }
  216. // Given a placeholder node which has only the hash set,
  217. // load the rest of the data from db.
  218. // Not threadsafe.
  219. func (self *IAVLNode) fill(db Db) {
  220. if self.hash == nil {
  221. panic("placeholder.hash can't be nil")
  222. }
  223. buf := db.Get(self.hash)
  224. r := bytes.NewReader(buf)
  225. var n int64
  226. var err error
  227. // node header & key
  228. self.height = ReadUInt8(r, &n, &err)
  229. self.size = ReadUInt64(r, &n, &err)
  230. self.key = ReadByteSlice(r, &n, &err)
  231. if err != nil {
  232. panic(err)
  233. }
  234. // node value or children.
  235. if self.height == 0 {
  236. // value
  237. self.value = ReadByteSlice(r, &n, &err)
  238. } else {
  239. // left
  240. leftHash := ReadByteSlice(r, &n, &err)
  241. self.left = &IAVLNode{
  242. hash: leftHash,
  243. flags: IAVLNODE_FLAG_PERSISTED | IAVLNODE_FLAG_PLACEHOLDER,
  244. }
  245. // right
  246. rightHash := ReadByteSlice(r, &n, &err)
  247. self.right = &IAVLNode{
  248. hash: rightHash,
  249. flags: IAVLNODE_FLAG_PERSISTED | IAVLNODE_FLAG_PLACEHOLDER,
  250. }
  251. if r.Len() != 0 {
  252. panic("buf not all consumed")
  253. }
  254. }
  255. if err != nil {
  256. panic(err)
  257. }
  258. self.flags &= ^IAVLNODE_FLAG_PLACEHOLDER
  259. }
  260. func (self *IAVLNode) leftFilled(db Db) *IAVLNode {
  261. if self.left.flags&IAVLNODE_FLAG_PLACEHOLDER > 0 {
  262. self.left.fill(db)
  263. }
  264. return self.left
  265. }
  266. func (self *IAVLNode) rightFilled(db Db) *IAVLNode {
  267. if self.right.flags&IAVLNODE_FLAG_PLACEHOLDER > 0 {
  268. self.right.fill(db)
  269. }
  270. return self.right
  271. }
  272. func (self *IAVLNode) rotateRight(db Db) *IAVLNode {
  273. self = self.Copy()
  274. sl := self.leftFilled(db).Copy()
  275. slr := sl.right
  276. sl.right = self
  277. self.left = slr
  278. self.calcHeightAndSize(db)
  279. sl.calcHeightAndSize(db)
  280. return sl
  281. }
  282. func (self *IAVLNode) rotateLeft(db Db) *IAVLNode {
  283. self = self.Copy()
  284. sr := self.rightFilled(db).Copy()
  285. srl := sr.left
  286. sr.left = self
  287. self.right = srl
  288. self.calcHeightAndSize(db)
  289. sr.calcHeightAndSize(db)
  290. return sr
  291. }
  292. func (self *IAVLNode) calcHeightAndSize(db Db) {
  293. self.height = maxUint8(self.leftFilled(db).Height(), self.rightFilled(db).Height()) + 1
  294. self.size = self.leftFilled(db).Size() + self.rightFilled(db).Size()
  295. }
  296. func (self *IAVLNode) calcBalance(db Db) int {
  297. return int(self.leftFilled(db).Height()) - int(self.rightFilled(db).Height())
  298. }
  299. func (self *IAVLNode) balance(db Db) (newSelf *IAVLNode) {
  300. balance := self.calcBalance(db)
  301. if balance > 1 {
  302. if self.leftFilled(db).calcBalance(db) >= 0 {
  303. // Left Left Case
  304. return self.rotateRight(db)
  305. } else {
  306. // Left Right Case
  307. self = self.Copy()
  308. self.left = self.leftFilled(db).rotateLeft(db)
  309. //self.calcHeightAndSize()
  310. return self.rotateRight(db)
  311. }
  312. }
  313. if balance < -1 {
  314. if self.rightFilled(db).calcBalance(db) <= 0 {
  315. // Right Right Case
  316. return self.rotateLeft(db)
  317. } else {
  318. // Right Left Case
  319. self = self.Copy()
  320. self.right = self.rightFilled(db).rotateRight(db)
  321. //self.calcHeightAndSize()
  322. return self.rotateLeft(db)
  323. }
  324. }
  325. // Nothing changed
  326. return self
  327. }
  328. func (self *IAVLNode) lmd(db Db) *IAVLNode {
  329. if self.height == 0 {
  330. return self
  331. }
  332. return self.leftFilled(db).lmd(db)
  333. }
  334. func (self *IAVLNode) rmd(db Db) *IAVLNode {
  335. if self.height == 0 {
  336. return self
  337. }
  338. return self.rightFilled(db).rmd(db)
  339. }
  340. func (self *IAVLNode) traverse(db Db, cb func(*IAVLNode) bool) bool {
  341. stop := cb(self)
  342. if stop {
  343. return stop
  344. }
  345. if self.height > 0 {
  346. stop = self.leftFilled(db).traverse(db, cb)
  347. if stop {
  348. return stop
  349. }
  350. stop = self.rightFilled(db).traverse(db, cb)
  351. if stop {
  352. return stop
  353. }
  354. }
  355. return false
  356. }