github.com/incognitochain/go-incognito-sdk@v1.0.1/privacy/zkp/utils/utils.go (about)

     1  package utils
     2  
     3  import (
     4  	"github.com/incognitochain/go-incognito-sdk/common"
     5  	"github.com/incognitochain/go-incognito-sdk/privacy"
     6  	"github.com/incognitochain/go-incognito-sdk/privacy/zkp/aggregaterange"
     7  )
     8  
     9  // GenerateChallengeFromByte get hash of n points in G append with input values
    10  // return blake_2b(G[0]||G[1]||...||G[CM_CAPACITY-1]||<values>)
    11  // G[i] is list of all generator point of Curve
    12  func GenerateChallenge(values [][]byte) *privacy.Scalar {
    13  	bytes := []byte{}
    14  	for i := 0; i < len(privacy.PedCom.G); i++ {
    15  		bytes = append(bytes, privacy.PedCom.G[i].ToBytesS()...)
    16  	}
    17  
    18  	for i := 0; i < len(values); i++ {
    19  		bytes = append(bytes, values[i]...)
    20  	}
    21  
    22  	hash := privacy.HashToScalar(bytes)
    23  	//res := new(big.Int).SetBytes(hash)
    24  	//res.Mod(res, privacy.Curve.Params().N)
    25  	return hash
    26  }
    27  
    28  // EstimateProofSize returns the estimated size of the proof in bytes
    29  func EstimateProofSize(nInput int, nOutput int, hasPrivacy bool) uint64 {
    30  	if !hasPrivacy {
    31  		FlagSize := 14 + 2*nInput + nOutput
    32  		sizeSNNoPrivacyProof := nInput * SnNoPrivacyProofSize
    33  		sizeInputCoins := nInput * inputCoinsNoPrivacySize
    34  		sizeOutputCoins := nOutput * OutputCoinsNoPrivacySize
    35  
    36  		sizeProof := uint64(FlagSize + sizeSNNoPrivacyProof + sizeInputCoins + sizeOutputCoins)
    37  		return uint64(sizeProof)
    38  	}
    39  
    40  	FlagSize := 14 + 7*nInput + 4*nOutput
    41  
    42  	sizeOneOfManyProof := nInput * OneOfManyProofSize
    43  	sizeSNPrivacyProof := nInput * SnPrivacyProofSize
    44  	sizeComOutputMultiRangeProof := int(aggregaterange.EstimateMultiRangeProofSize(nOutput))
    45  
    46  	sizeInputCoins := nInput * inputCoinsPrivacySize
    47  	sizeOutputCoins := nOutput * outputCoinsPrivacySize
    48  
    49  	sizeComOutputValue := nOutput * privacy.Ed25519KeySize
    50  	sizeComOutputSND := nOutput * privacy.Ed25519KeySize
    51  	sizeComOutputShardID := nOutput * privacy.Ed25519KeySize
    52  
    53  	sizeComInputSK := privacy.Ed25519KeySize
    54  	sizeComInputValue := nInput * privacy.Ed25519KeySize
    55  	sizeComInputSND := nInput * privacy.Ed25519KeySize
    56  	sizeComInputShardID := privacy.Ed25519KeySize
    57  
    58  	sizeCommitmentIndices := nInput * privacy.CommitmentRingSize * common.Uint64Size
    59  
    60  	sizeProof := sizeOneOfManyProof + sizeSNPrivacyProof +
    61  		sizeComOutputMultiRangeProof + sizeInputCoins + sizeOutputCoins +
    62  		sizeComOutputValue + sizeComOutputSND + sizeComOutputShardID +
    63  		sizeComInputSK + sizeComInputValue + sizeComInputSND + sizeComInputShardID +
    64  		sizeCommitmentIndices + FlagSize
    65  
    66  	return uint64(sizeProof)
    67  }