forked from hyperledger/fabric
-
Notifications
You must be signed in to change notification settings - Fork 1
/
trie_key.go
102 lines (81 loc) · 2.76 KB
/
trie_key.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
Copyright IBM Corp. 2016 All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package trie
import (
"bytes"
"fmt"
"github.com/hyperledger/fabric/core/ledger/statemgmt"
)
type trieKeyEncoder interface {
newTrieKey(originalBytes []byte) trieKeyInterface
getMaxTrieWidth() int
decodeTrieKeyBytes(encodedBytes []byte) (originalBytes []byte)
}
type trieKeyInterface interface {
getLevel() int
getParentTrieKey() trieKeyInterface
getIndexInParent() int
getEncodedBytes() []byte
}
var trieKeyEncoderImpl trieKeyEncoder = newByteTrieKeyEncoder()
var rootTrieKeyBytes = []byte{}
var rootTrieKeyStr = string(rootTrieKeyBytes)
var rootTrieKey = newTrieKeyFromCompositeKey(rootTrieKeyBytes)
type trieKey struct {
trieKeyImpl trieKeyInterface
}
func newTrieKey(chaincodeID string, key string) *trieKey {
compositeKey := statemgmt.ConstructCompositeKey(chaincodeID, key)
return newTrieKeyFromCompositeKey(compositeKey)
}
func newTrieKeyFromCompositeKey(compositeKey []byte) *trieKey {
return &trieKey{trieKeyEncoderImpl.newTrieKey(compositeKey)}
}
func decodeTrieKeyBytes(encodedBytes []byte) []byte {
return trieKeyEncoderImpl.decodeTrieKeyBytes(encodedBytes)
}
func (key *trieKey) getEncodedBytes() []byte {
return key.trieKeyImpl.getEncodedBytes()
}
func (key *trieKey) getLevel() int {
return key.trieKeyImpl.getLevel()
}
func (key *trieKey) getIndexInParent() int {
if key.isRootKey() {
panic(fmt.Errorf("Parent for Trie root shoould not be asked for"))
}
return key.trieKeyImpl.getIndexInParent()
}
func (key *trieKey) getParentTrieKey() *trieKey {
if key.isRootKey() {
panic(fmt.Errorf("Parent for Trie root shoould not be asked for"))
}
return &trieKey{key.trieKeyImpl.getParentTrieKey()}
}
func (key *trieKey) getEncodedBytesAsStr() string {
return string(key.trieKeyImpl.getEncodedBytes())
}
func (key *trieKey) isRootKey() bool {
return len(key.getEncodedBytes()) == 0
}
func (key *trieKey) getParentLevel() int {
if key.isRootKey() {
panic(fmt.Errorf("Parent for Trie root shoould not be asked for"))
}
return key.getLevel() - 1
}
func (key *trieKey) assertIsChildOf(parentTrieKey *trieKey) {
if !bytes.Equal(key.getParentTrieKey().getEncodedBytes(), parentTrieKey.getEncodedBytes()) {
panic(fmt.Errorf("trie key [%s] is not a child of trie key [%s]", key, parentTrieKey))
}
}