88 "github.com/bitcoin-sv/go-sdk/util"
99)
1010
11- // MerkleTreeParentStr returns the Merkle Tree parent of two Merkle Tree children using hex strings instead of just bytes.
11+ // MerkleTreeParentStr returns the Merkle Tree parent of two MerkleTree children using hex strings instead of just bytes.
1212func MerkleTreeParentStr (leftNode , rightNode string ) (string , error ) {
1313 l , err := hex .DecodeString (leftNode )
1414 if err != nil {
@@ -24,18 +24,27 @@ func MerkleTreeParentStr(leftNode, rightNode string) (string, error) {
2424
2525// MerkleTreeParent returns the Merkle Tree parent of two MerkleTree children.
2626func MerkleTreeParent (leftNode , rightNode []byte ) []byte {
27- // swap endianness before concatenating
28- l := util .ReverseBytes (leftNode )
29- r := util .ReverseBytes (rightNode )
27+ concatenated := flipTwoArrays (leftNode , rightNode )
3028
31- // concatenate leaves
32- concat := append (l , r ... )
29+ hash := crypto .Sha256d (concatenated )
3330
34- // hash the concatenation
35- hash := crypto .Sha256d (concat )
31+ util .ReverseBytesInPlace (hash )
3632
37- // swap endianness at the end and convert to hex string
38- return util .ReverseBytes (hash )
33+ return hash
34+ }
35+
36+ // flipTwoArrays reverses two byte arrays individually and returns as one concatenated slice
37+ // example:
38+ // for a=[a, b, c], b=[d, e, f] the result is [c, b, a, f, e, d]
39+ func flipTwoArrays (a , b []byte ) []byte {
40+ result := make ([]byte , 0 , len (a )+ len (b ))
41+ for i := len (a ) - 1 ; i >= 0 ; i -- {
42+ result = append (result , a [i ])
43+ }
44+ for i := len (b ) - 1 ; i >= 0 ; i -- {
45+ result = append (result , b [i ])
46+ }
47+ return result
3948}
4049
4150// MerkleTreeParentBytes returns the Merkle Tree parent of two Merkle Tree children.
0 commit comments