@@ -8,6 +8,30 @@ const { toNodeObject, progress } = require('./utils')
88
99const ZERO = '0x0000000000000000000000000000000000000000000000000000000000000000'
1010
11+ String . prototype . hex = function ( ) {
12+ return web3 . utils . stringToHex ( this )
13+ }
14+ const FOO = 'foo' . hex ( )
15+ const BAR = 'bar' . hex ( )
16+ const BAZ = 'baz' . hex ( )
17+ const QUX = 'qux' . hex ( )
18+ const FUZ = 'fuz' . hex ( )
19+ const KEY1 = 'key1' . hex ( )
20+ const KEY2 = 'key2' . hex ( )
21+ const KEY3 = 'key3' . hex ( )
22+ const KEY4 = 'key4' . hex ( )
23+ const KEY5 = 'key5' . hex ( )
24+ const VAL1 = 'val1' . hex ( )
25+ const VAL2 = 'val2' . hex ( )
26+ const VAL3 = 'val3' . hex ( )
27+ const VAL4 = 'val4' . hex ( )
28+ const VAL5 = 'val5' . hex ( )
29+ const VALUE1 = 'value1' . hex ( )
30+ const VALUE2 = 'value2' . hex ( )
31+ const VALUE3 = 'value3' . hex ( )
32+ const VALUE4 = 'value4' . hex ( )
33+ const VALUE5 = 'value5' . hex ( )
34+
1135contract ( 'PatriciaTree' , async ( [ _ , primary , nonPrimary ] ) => {
1236 context ( 'inherits the patricia tree smart contract' , async ( ) => {
1337 let tree
@@ -19,28 +43,28 @@ contract('PatriciaTree', async ([_, primary, nonPrimary]) => {
1943 let itemCount = 10
2044 let items = { }
2145 for ( let i = 0 ; i < itemCount ; i ++ ) {
22- items [ web3 . sha3 ( 'key' + Math . random ( ) ) ] = web3 . sha3 ( 'val' + Math . random ( ) )
46+ items [ web3 . utils . sha3 ( 'key' + Math . random ( ) ) ] = web3 . utils . sha3 ( 'val' + Math . random ( ) )
2347 }
2448 let count = 1
2549 for ( const key of Object . keys ( items ) ) {
26- await tree . insert ( key , items [ key ] , { from : primary } )
27- let estimatedGasToAddNewValue = await tree . insert . estimateGas ( web3 . sha3 ( 'key' + Math . random ( ) ) , web3 . sha3 ( 'val' + Math . random ( ) ) , { from : primary } )
50+ await tree . insert ( key . hex ( ) , items [ key ] , { from : primary } )
51+ let estimatedGasToAddNewValue = await tree . insert . estimateGas ( web3 . utils . sha3 ( 'key' + Math . random ( ) ) , web3 . utils . sha3 ( 'val' + Math . random ( ) ) , { from : primary } )
2852 progress . log ( `(${ count ++ } /${ itemCount } ) Required gas for a transaction: ${ estimatedGasToAddNewValue } ` )
2953 assert . isTrue ( estimatedGasToAddNewValue < 1000000 )
3054 }
3155 progress . close ( )
3256 } )
3357 it ( 'should allow only primary address to put items' , async ( ) => {
34- await tree . insert ( 'foo' , 'bar' , { from : primary } )
58+ await tree . insert ( FOO , BAR , { from : primary } )
3559 } )
3660 it ( 'should allow overwriting' , async ( ) => {
37- await tree . insert ( 'foo' , 'bar' , { from : primary } )
38- await tree . insert ( 'foo' , 'baz' , { from : primary } )
39- assert . equal ( web3 . toUtf8 ( await tree . get ( 'foo' ) ) , 'baz' )
61+ await tree . insert ( FOO , BAR , { from : primary } )
62+ await tree . insert ( FOO , BAZ , { from : primary } )
63+ assert . equal ( await tree . get ( FOO ) , BAZ )
4064 } )
4165 it ( 'should revert when a non-primary address tries to insert a new item' , async ( ) => {
4266 try {
43- await tree . insert ( 'foo' , 'bar' , { from : nonPrimary } )
67+ await tree . insert ( FOO , BAR , { from : nonPrimary } )
4468 assert . fail ( 'it should throw an error' )
4569 } catch ( e ) {
4670 assert . ok ( 'it is successfully reverted' )
@@ -54,30 +78,30 @@ contract('PatriciaTree', async ([_, primary, nonPrimary]) => {
5478 } )
5579 it ( 'should update its root hash when every new items are put into' , async ( ) => {
5680 // insert an item
57- await tree . insert ( 'foo' , 'bar' , { from : primary } )
81+ await tree . insert ( FOO , BAR , { from : primary } )
5882 let firstRootHash = await tree . getRootHash ( )
5983 // insert an item again
60- await tree . insert ( 'baz' , 'qux' , { from : primary } )
84+ await tree . insert ( BAZ , QUX , { from : primary } )
6185 let secondRootHash = await tree . getRootHash ( )
6286 assert . notEqual ( firstRootHash , secondRootHash )
6387 // insert an item again
64- await tree . insert ( 'foo' , 'baz' , { from : primary } )
88+ await tree . insert ( FOO , BAZ , { from : primary } )
6589 let thirdRootHash = await tree . getRootHash ( )
6690 assert . notEqual ( secondRootHash , thirdRootHash )
6791 } )
6892
6993 it ( 'should return same root hash for same write history' , async ( ) => {
7094 // define items to put
7195 let items = {
72- key1 : 'val1' ,
73- key2 : 'val2' ,
74- key3 : 'val3'
96+ key1 : VAL1 ,
97+ key2 : VAL2 ,
98+ key3 : VAL3
7599 }
76100
77101 // insert items into the first tree
78102 for ( const key of Object . keys ( items ) ) {
79103 progress . log ( `Insert items (${ key } , ${ items [ key ] } )` )
80- await tree . insert ( key , items [ key ] , { from : primary } )
104+ await tree . insert ( key . hex ( ) , items [ key ] , { from : primary } )
81105 }
82106 progress . close ( )
83107 // get root hash of the first tree
@@ -89,7 +113,7 @@ contract('PatriciaTree', async ([_, primary, nonPrimary]) => {
89113 // insert same items into the second tree
90114 for ( const key of Object . keys ( items ) ) {
91115 await progress . log ( `Insert items into the second tree (${ key } , ${ items [ key ] } )` , 500 )
92- await secondTree . insert ( key , items [ key ] , { from : primary } )
116+ await secondTree . insert ( key . hex ( ) , items [ key ] , { from : primary } )
93117 }
94118 progress . close ( )
95119 // get root hash of the second tree
@@ -104,16 +128,16 @@ contract('PatriciaTree', async ([_, primary, nonPrimary]) => {
104128 describe ( 'getNode()' , async ( ) => {
105129 it ( 'should able to find all nodes' , async ( ) => {
106130 let items = {
107- 'key1' : 'value1' ,
108- 'key2' : 'value2' ,
109- 'key3' : 'value3' ,
110- 'key4' : 'value4' ,
111- 'key5' : 'value5'
131+ KEY1 : VALUE1 ,
132+ KEY2 : VALUE2 ,
133+ KEY3 : VALUE3 ,
134+ KEY4 : VALUE4 ,
135+ KEY5 : VALUE5
112136 }
113137
114138 // insert items
115139 for ( const key of Object . keys ( items ) ) {
116- await tree . insert ( key , items [ key ] , { from : primary } )
140+ await tree . insert ( key . hex ( ) , items [ key ] , { from : primary } )
117141 }
118142
119143 // find all nodes and check stored value hash
@@ -156,7 +180,7 @@ contract('PatriciaTree', async ([_, primary, nonPrimary]) => {
156180
157181 // Compare the found leaf nodes and initial items
158182 let hashValuesFromLeafNodes = leafNodes . map ( leafNode => leafNode . hash )
159- let hashValuesFromInitialItems = Object . values ( items ) . map ( item => web3 . sha3 ( item ) )
183+ let hashValuesFromInitialItems = Object . values ( items ) . map ( item => web3 . utils . sha3 ( item ) )
160184 assert . equal (
161185 JSON . stringify ( hashValuesFromLeafNodes . sort ( ) ) ,
162186 JSON . stringify ( hashValuesFromInitialItems . sort ( ) )
@@ -170,32 +194,32 @@ contract('PatriciaTree', async ([_, primary, nonPrimary]) => {
170194
171195 describe ( 'getProof() & verifyProof()' , async ( ) => {
172196 it ( 'should be able to verify merkle proof for a given key' , async ( ) => {
173- let items = { key1 : 'value1' , key2 : 'value2' , key3 : 'value3' }
197+ let items = { key1 : VALUE1 , key2 : VALUE2 , key3 : VALUE3 }
174198 for ( const key of Object . keys ( items ) ) {
175- await tree . insert ( key , items [ key ] , { from : primary } )
199+ await tree . insert ( key . hex ( ) , items [ key ] , { from : primary } )
176200 }
177201 let count = 0
178202 for ( const key of Object . keys ( items ) ) {
179- let [ branchMask , siblings ] = await tree . getProof ( key )
203+ let { branchMask, _siblings } = await tree . getProof ( key . hex ( ) )
180204 let rootHash = await tree . getRootHash ( )
181- await tree . verifyProof ( rootHash , key , items [ key ] , branchMask , siblings )
205+ await tree . verifyProof ( rootHash , key . hex ( ) , items [ key ] , branchMask , _siblings )
182206 progress . log ( `(${ count ++ } /${ Object . keys ( items ) . length } ) Merkle proof for ${ key } :${ items [ key ] } ` )
183207 assert . ok ( 'is not reverted' )
184208 }
185209 progress . close ( )
186210 } )
187211
188212 it ( 'should throw an error for an invalid merkle proof' , async ( ) => {
189- let items = { key1 : 'value1' , key2 : 'value2' , key3 : 'value3' }
213+ let items = { key1 : VALUE1 , key2 : VALUE2 , key3 : VALUE3 }
190214 for ( const key of Object . keys ( items ) ) {
191- await tree . insert ( key , items [ key ] , { from : primary } )
215+ await tree . insert ( key . hex ( ) , items [ key ] , { from : primary } )
192216 }
193217 let count = 0
194218 for ( const key of Object . keys ( items ) ) {
195- let [ branchMask , siblings ] = await tree . getProof ( key )
219+ let { branchMask, _siblings } = await tree . getProof ( key . hex ( ) )
196220 let rootHash = await tree . getRootHash ( )
197221 try {
198- await tree . verifyProof ( rootHash , key , `manipulate${ items [ key ] } ` , branchMask , siblings )
222+ await tree . verifyProof ( rootHash , key , `manipulate${ items [ key ] } ` , branchMask , _siblings )
199223 } catch ( e ) {
200224 progress . log ( `(${ count ++ } /${ Object . keys ( items ) . length } ) fraud proof for ${ key } :${ items [ key ] } ` )
201225 assert . ok ( 'reverted' )
@@ -207,20 +231,20 @@ contract('PatriciaTree', async ([_, primary, nonPrimary]) => {
207231
208232 describe ( 'get()' , async ( ) => {
209233 it ( 'should return stored value for the given key' , async ( ) => {
210- await tree . insert ( 'foo' , 'bar' , { from : primary } )
211- assert . equal ( web3 . toUtf8 ( await tree . get ( 'foo' ) ) , 'bar' )
234+ await tree . insert ( FOO , BAR , { from : primary } )
235+ assert . equal ( await tree . get ( FOO ) , BAR )
212236 } )
213237 } )
214238
215239 describe ( 'safeGet()' , async ( ) => {
216240 it ( 'should return stored value for the given key' , async ( ) => {
217- await tree . insert ( 'foo' , 'bar' , { from : primary } )
218- assert . equal ( web3 . toUtf8 ( await tree . get ( 'foo' ) ) , 'bar' )
241+ await tree . insert ( FOO , BAR , { from : primary } )
242+ assert . equal ( await tree . get ( FOO ) , BAR )
219243 } )
220244 it ( 'should throw if the given key is not included' , async ( ) => {
221- await tree . insert ( 'foo' , 'bar' , { from : primary } )
245+ await tree . insert ( FOO , BAR , { from : primary } )
222246 try {
223- await tree . get ( 'fuz' )
247+ await tree . get ( FUZ )
224248 assert . fail ( 'Did not reverted' )
225249 } catch ( e ) {
226250 assert . ok ( 'Reverted successfully' )
@@ -230,26 +254,26 @@ contract('PatriciaTree', async ([_, primary, nonPrimary]) => {
230254
231255 describe ( 'doesInclude()' , async ( ) => {
232256 it ( 'should return boolean whether the tree includes the given key or not' , async ( ) => {
233- await tree . insert ( 'foo' , 'bar' , { from : primary } )
234- assert . equal ( await tree . doesInclude ( 'foo' ) , true )
235- assert . equal ( await tree . doesInclude ( 'fuz' ) , false )
257+ await tree . insert ( FOO , BAR , { from : primary } )
258+ assert . equal ( await tree . doesInclude ( FOO ) , true )
259+ assert . equal ( await tree . doesInclude ( FUZ ) , false )
236260 } )
237261 } )
238262
239263 describe ( 'getNonInclusionProof()' , async ( ) => {
240- let items = { key1 : 'value1' , key2 : 'value2' , key3 : 'value3' }
264+ let items = { key1 : VALUE1 , key2 : VALUE2 , key3 : VALUE3 }
241265 it ( 'should return proof data when the key does not exist' , async ( ) => {
242266 for ( const key of Object . keys ( items ) ) {
243- await tree . insert ( key , items [ key ] , { from : primary } )
267+ await tree . insert ( key . hex ( ) , items [ key ] , { from : primary } )
244268 }
245- await tree . getNonInclusionProof ( 'key4' )
269+ await tree . getNonInclusionProof ( KEY4 )
246270 } )
247271 it ( 'should not return data when the key does exist' , async ( ) => {
248272 for ( const key of Object . keys ( items ) ) {
249- await tree . insert ( key , items [ key ] , { from : primary } )
273+ await tree . insert ( key . hex ( ) , items [ key ] , { from : primary } )
250274 }
251275 try {
252- await tree . getNonInclusionProof ( 'key1' )
276+ await tree . getNonInclusionProof ( KEY1 )
253277 assert . fail ( 'Did not reverted' )
254278 } catch ( e ) {
255279 assert . ok ( 'Reverted successfully' )
@@ -259,16 +283,16 @@ contract('PatriciaTree', async ([_, primary, nonPrimary]) => {
259283
260284 describe ( 'verifyNonInclusionProof()' , async ( ) => {
261285 it ( 'should be passed when we use correct proof data' , async ( ) => {
262- let items = { key1 : 'value1' , key2 : 'value2' , key3 : 'value3' }
286+ let items = { key1 : VALUE1 , key2 : VALUE2 , key3 : VALUE3 }
263287 for ( const key of Object . keys ( items ) ) {
264- await tree . insert ( key , items [ key ] , { from : primary } )
288+ await tree . insert ( key . hex ( ) , items [ key ] , { from : primary } )
265289 }
266290 let rootHash = await tree . getRootHash ( )
267- let [ potentialSiblingLabel , potentialSiblingValue , branchMask , siblings ] = await tree . getNonInclusionProof ( 'key4' )
268- await tree . verifyNonInclusionProof ( rootHash , 'key4' , potentialSiblingLabel , potentialSiblingValue , branchMask , siblings )
291+ let { leafLabel , leafNode , branchMask, _siblings } = await tree . getNonInclusionProof ( KEY4 )
292+ await tree . verifyNonInclusionProof ( rootHash , KEY4 , leafLabel , leafNode , branchMask , _siblings )
269293 for ( const key of Object . keys ( items ) ) {
270294 try {
271- await tree . verifyNonInclusionProof ( rootHash , key , potentialSiblingLabel , potentialSiblingValue , branchMask , siblings )
295+ await tree . verifyNonInclusionProof ( rootHash , key . hex ( ) , potentialSiblingLabel , potentialSiblingValue , branchMask , _siblings )
272296 assert . fail ( 'Did not reverted' )
273297 } catch ( e ) {
274298 assert . ok ( 'Reverted successfully' )
0 commit comments