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 }