Skip to content

Commit 3cecbb6

Browse files
gtreptarv-jenkins
authored andcommitted
Merkle Tree bugfix + new function (#530)
* Add MerkleUpdateMap * Fix nibbleize (nibble arrangement) and byteify (zero byte) * Remove unnecessary rule
1 parent 9a1e580 commit 3cecbb6

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

data.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,20 +1073,31 @@ Merkle Patricia Tree
10731073
=> #merkleBrancher ( M, BRANCHVALUE, PATH[0], PATH[1 .. #sizeByteArray(PATH) -Int 1], VALUE ) [owise]
10741074
```
10751075

1076+
- `MerkleUpdateMap` Takes a mapping of `ByteArray |-> String` and generates a trie
1077+
1078+
```k
1079+
syntax MerkleTree ::= MerkleUpdateMap( MerkleTree, Map ) [function]
1080+
// -------------------------------------------------------------------
1081+
rule MerkleUpdateMap( TREE, KEY |-> VALUE M ) => MerkleUpdateMap( MerkleUpdate( TREE, #nibbleize(KEY), VALUE ) , M )
1082+
1083+
rule MerkleUpdateMap( TREE, .Map ) => TREE
1084+
```
1085+
10761086
Merkle Tree Aux Functions
10771087
-------------------------
10781088

10791089
```k
10801090
syntax ByteArray ::= #nibbleize ( ByteArray ) [function]
10811091
| #byteify ( ByteArray ) [function]
10821092
// --------------------------------------------------------
1083-
rule #nibbleize ( B ) => #asByteStack ( ( B [ 0 ] /Int 16 ) *Int 256 +Int ( B [ 0 ] %Int 16 ) )[0 .. 2]
1084-
++ #nibbleize ( B[1 .. #sizeByteArray(B) -Int 1] )
1093+
rule #nibbleize ( B ) => ( #asByteStack ( ( B [ 0 ] /Int 16 ) *Int 256 )[0 .. 1]
1094+
++ ( #asByteStack ( B [ 0 ] %Int 16 )[0 .. 1] )
1095+
) ++ #nibbleize ( B[1 .. #sizeByteArray(B) -Int 1] )
10851096
requires #sizeByteArray( B ) >Int 0
10861097
10871098
rule #nibbleize ( _ ) => .ByteArray [owise]
10881099
1089-
rule #byteify ( B ) => #asByteStack ( B[0] *Int 16 +Int B[1] )
1100+
rule #byteify ( B ) => #asByteStack ( B[0] *Int 16 +Int B[1] )[0 .. 1]
10901101
++ #byteify ( B[2 .. #sizeByteArray(B) -Int 2] )
10911102
requires #sizeByteArray(B) >Int 0
10921103

tests/specs/functional/merkle-spec.k

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,15 @@ module MERKLE-SPEC
5555
rule <k> runMerkle ( Keccak256( #rlpEncodeMerkleTree( MerkleUpdate( MerkleUpdate( MerkleUpdate( MerkleUpdate( .MerkleTree, "do", "verb" ), "horse", "stallion" ), "doge", "coin" ), "dog", "puppy" ) ) ) )
5656
=> doneMerkle( "5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84" ) </k>
5757

58+
rule <k> runMerkle( Keccak256( #rlpEncodeMerkleTree( MerkleUpdateMap( .MerkleTree,
59+
#parseByteStack( "do" ) |-> "verb"
60+
#parseByteStack( "dog" ) |-> "puppy"
61+
#parseByteStack( "doge" ) |-> "coin"
62+
#parseByteStack( "horse" ) |-> "stallion"
63+
)
64+
)
65+
)
66+
)
67+
=> doneMerkle( "5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84" )
68+
</k>
5869
endmodule

0 commit comments

Comments
 (0)