merkle/simple_proof.go
func computeHashFromAunts(index int, total int, leafHash []byte, innerHashes [][]byte) []byte {
	if index >= total || index < 0 || total <= 0 {
		return nil
	}
	switch total {
	case 0:
		panic("Cannot call computeHashFromAunts() with 0 total")
	case 1:
		if len(innerHashes) != 0 {
			return nil
		}
		return leafHash
	default:
		if len(innerHashes) == 0 {
			return nil
		}
		numLeft := (total + 1) / 2
		if index < numLeft {
			leftHash := computeHashFromAunts(index, numLeft, leafHash, innerHashes[:len(innerHashes)-1])
			if leftHash == nil {
				return nil
			}
			return SimpleHashFromTwoHashes(leftHash, innerHashes[len(innerHashes)-1])
		}
		rightHash := computeHashFromAunts(index-numLeft, total-numLeft, leafHash, innerHashes[:len(innerHashes)-1])
		if rightHash == nil {
			return nil
		}
		return SimpleHashFromTwoHashes(innerHashes[len(innerHashes)-1], rightHash)
	}
}
func computeHashFromAunts(index int, total int, leafHash []byte, innerHashes [][]byte) []byte {
	if index >= total || index < 0 || total <= 0 {
		return nil
	}
	switch total {
	case 0:
		panic("Cannot call computeHashFromAunts() with 0 total")
	case 1:
		if len(innerHashes) != 0 {
			return nil
		}
		return leafHash
	default:
		if len(innerHashes) == 0 {
			return nil
		}
		numLeft := (total + 1) / 2
		if index < numLeft {
			leftHash := computeHashFromAunts(index, numLeft, leafHash, innerHashes[:len(innerHashes)-1])
			if leftHash == nil {
				return nil
			}
			return SimpleHashFromTwoHashes(leftHash, innerHashes[len(innerHashes)-1])
		}
		rightHash := computeHashFromAunts(index-numLeft, total-numLeft, leafHash, innerHashes[:len(innerHashes)-1])
		if rightHash == nil {
			return nil
		}
		return SimpleHashFromTwoHashes(innerHashes[len(innerHashes)-1], rightHash)
	}
}
func computeHashFromAunts ( index int , total int , leafHash [ ] byte , innerHashes [ ] [ ] byte ) [ ] byte { if index >= total || index < 0 || total <= 0 { return nil } switch total { case 0 : panic ( " " ) case 1 : if len ( innerHashes ) != 0 { return nil } return leafHash default : if len ( innerHashes ) == 0 { return nil } numLeft := ( total + 1 ) / 2 if index < numLeft { leftHash := computeHashFromAunts ( index , numLeft , leafHash , innerHashes [ : len ( innerHashes ) - 1 ] ) if leftHash == nil { return nil } return SimpleHashFromTwoHashes ( leftHash , innerHashes [ len ( innerHashes ) - 1 ] ) } rightHash := computeHashFromAunts ( index - numLeft , total - numLeft , leafHash , innerHashes [ : len ( innerHashes ) - 1 ] ) if rightHash == nil { return nil } return SimpleHashFromTwoHashes ( innerHashes [ len ( innerHashes ) - 1 ] , rightHash ) } }
// Use the leafHash and innerHashes to get the root merkle hash.
// If the length of the innerHashes slice isn't exactly correct, the result is nil.
// Recursive impl.
Use the leafHash and innerHashes to get the root merkle hash . If the length of the innerHashes slice isn t exactly correct the result is nil . Recursive impl .