github.com/cryptoecc/eth-ecc@v0.0.3/consensus/eccpow/LDPCDecoder.go (about)

     1  package eccpow
     2  
     3  import (
     4  	"encoding/binary"
     5  	"math"
     6  
     7  	"github.com/cryptoecc/ETH-ECC/core/types"
     8  	"github.com/cryptoecc/ETH-ECC/crypto"
     9  )
    10  
    11  //OptimizedDecoding return hashVector, outputWord, LRrtl
    12  func OptimizedDecoding(parameters Parameters, hashVector []int, H, rowInCol, colInRow [][]int) ([]int, []int, [][]float64) {
    13  	outputWord := make([]int, parameters.n)
    14  	LRqtl := make([][]float64, parameters.n)
    15  	LRrtl := make([][]float64, parameters.n)
    16  	LRft := make([]float64, parameters.n)
    17  
    18  	for i := 0; i < parameters.n; i++ {
    19  		LRqtl[i] = make([]float64, parameters.m)
    20  		LRrtl[i] = make([]float64, parameters.m)
    21  		LRft[i] = math.Log((1-crossErr)/crossErr) * float64((hashVector[i]*2 - 1))
    22  	}
    23  	LRpt := make([]float64, parameters.n)
    24  
    25  	for ind := 1; ind <= maxIter; ind++ {
    26  		for t := 0; t < parameters.n; t++ {
    27  			temp3 := 0.0
    28  
    29  			for mp := 0; mp < parameters.wc; mp++ {
    30  				temp3 = infinityTest(temp3 + LRrtl[t][rowInCol[mp][t]])
    31  			}
    32  			for m := 0; m < parameters.wc; m++ {
    33  				temp4 := temp3
    34  				temp4 = infinityTest(temp4 - LRrtl[t][rowInCol[m][t]])
    35  				LRqtl[t][rowInCol[m][t]] = infinityTest(LRft[t] + temp4)
    36  			}
    37  		}
    38  
    39  		for k := 0; k < parameters.wr; k++ {
    40  			for l := 0; l < parameters.wr; l++ {
    41  				temp3 := 0.0
    42  				sign := 1.0
    43  				tempSign := 0.0
    44  				for m := 0; m < parameters.wr; m++ {
    45  					if m != l {
    46  						temp3 = temp3 + funcF(math.Abs(LRqtl[colInRow[m][k]][k]))
    47  						if LRqtl[colInRow[m][k]][k] > 0.0 {
    48  							tempSign = 1.0
    49  						} else {
    50  							tempSign = -1.0
    51  						}
    52  						sign = sign * tempSign
    53  					}
    54  				}
    55  				magnitude := funcF(temp3)
    56  				LRrtl[colInRow[l][k]][k] = infinityTest(sign * magnitude)
    57  			}
    58  		}
    59  
    60  		for t := 0; t < parameters.n; t++ {
    61  			LRpt[t] = infinityTest(LRft[t])
    62  			for k := 0; k < parameters.wc; k++ {
    63  				LRpt[t] += LRrtl[t][rowInCol[k][t]]
    64  				LRpt[t] = infinityTest(LRpt[t])
    65  			}
    66  
    67  			if LRpt[t] >= 0 {
    68  				outputWord[t] = 1
    69  			} else {
    70  				outputWord[t] = 0
    71  			}
    72  		}
    73  	}
    74  
    75  	return hashVector, outputWord, LRrtl
    76  }
    77  
    78  //VerifyOptimizedDecoding return bool, hashVector, outputword, digest which are used for validation
    79  func VerifyOptimizedDecoding(header *types.Header, hash []byte) (bool, []int, []int, []byte) {
    80  	parameters, _ := setParameters(header)
    81  	H := generateH(parameters)
    82  	colInRow, rowInCol := generateQ(parameters, H)
    83  
    84  	seed := make([]byte, 40)
    85  	copy(seed, hash)
    86  	binary.LittleEndian.PutUint64(seed[32:], header.Nonce.Uint64())
    87  	seed = crypto.Keccak512(seed)
    88  
    89  	hashVector := generateHv(parameters, seed)
    90  	hashVectorOfVerification, outputWordOfVerification, _ := OptimizedDecoding(parameters, hashVector, H, rowInCol, colInRow)
    91  
    92  	if MakeDecision(header, colInRow, outputWordOfVerification) {
    93  		return true, hashVectorOfVerification, outputWordOfVerification, seed
    94  	}
    95  
    96  	return false, hashVectorOfVerification, outputWordOfVerification, seed
    97  }