Skip to content

Commit

Permalink
refactor(): Add review suggestions
Browse files Browse the repository at this point in the history
  • Loading branch information
kkirkov committed Jun 28, 2023
1 parent 4eec6ea commit e50de22
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 155 deletions.
90 changes: 63 additions & 27 deletions libs/nim/verify-utils/verify_given_proof.nim
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,43 @@ type
proc createVerificationKey*(path: string): VerificationKey =
let vk = parseFile(path)

let vkAlpha1 = Point[G1](x: FQ.fromString(vk["vk_alpha_1"][0].str), y: FQ.fromString(vk["vk_alpha_1"][1].str), z: FQ.fromString("1"))
let vkBeta2 = Point[G2](x: FQ2(c0: FQ.fromString(vk["vk_beta_2"][0][0].str), c1: FQ.fromString(vk["vk_beta_2"][0][1].str)), y: FQ2(c0: FQ.fromString(vk["vk_beta_2"][1][0].str), c1: FQ.fromString(vk["vk_beta_2"][1][1].str)), z: FQ2(c0: FQ.fromString("1"), c1: FQ.fromString("0")))
let vkGamma2 = Point[G2](x: FQ2(c0: FQ.fromString(vk["vk_gamma_2"][0][0].str), c1: FQ.fromString(vk["vk_gamma_2"][0][1].str)), y: FQ2(c0: FQ.fromString(vk["vk_gamma_2"][1][0].str), c1: FQ.fromString(vk["vk_gamma_2"][1][1].str)), z: FQ2(c0: FQ.fromString("1"), c1: FQ.fromString("0")))
let vkDelta2 = Point[G2](x: FQ2(c0: FQ.fromString(vk["vk_delta_2"][0][0].str), c1: FQ.fromString(vk["vk_delta_2"][0][1].str)), y: FQ2(c0: FQ.fromString(vk["vk_delta_2"][1][0].str), c1: FQ.fromString(vk["vk_delta_2"][1][1].str)), z: FQ2(c0: FQ.fromString("1"), c1: FQ.fromString("0")))
let fq0 = FQ.fromString("0")
let fq1 = FQ.fromString("1")

let alpha0 = FQ.fromString(vk["vk_alpha_1"][0].str)
let alpha1 = FQ.fromString(vk["vk_alpha_1"][1].str)
let vkAlpha1 = Point[G1](x: alpha0, y: alpha1, z: fq1)

let beta00 = FQ.fromString(vk["vk_beta_2"][0][0].str)
let beta01 = FQ.fromString(vk["vk_beta_2"][0][1].str)
let beta10 = FQ.fromString(vk["vk_beta_2"][1][0].str)
let beta11 = FQ.fromString(vk["vk_beta_2"][1][1].str)
let beta0 = FQ2(c0: beta00, c1: beta01)
let beta1 = FQ2(c0: beta10, c1: beta11)
let vkBeta2 = Point[G2](x: beta0, y: beta1, z: FQ2(c0: fq1, c1: fq0))

let gamma00 = FQ.fromString(vk["vk_gamma_2"][0][0].str)
let gamma01 = FQ.fromString(vk["vk_gamma_2"][0][1].str)
let gamma10 = FQ.fromString(vk["vk_gamma_2"][1][0].str)
let gamma11 = FQ.fromString(vk["vk_gamma_2"][1][1].str)
let gamma0 = FQ2(c0: gamma00, c1: gamma01)
let gamma1 = FQ2(c0: gamma10, c1: gamma11)
let vkGamma2 = Point[G2](x: gamma0, y: gamma1, z: FQ2(c0: fq1, c1: fq0))

let delta00 = FQ.fromString(vk["vk_delta_2"][0][0].str)
let delta01 = FQ.fromString(vk["vk_delta_2"][0][1].str)
let delta10 = FQ.fromString(vk["vk_delta_2"][1][0].str)
let delta11 = FQ.fromString(vk["vk_delta_2"][1][1].str)
let delta0 = FQ2(c0: delta00, c1: delta01)
let delta1 = FQ2(c0: delta10, c1: delta11)
let vkDelta2 = Point[G2](x: delta0, y: delta1, z: FQ2(c0: fq1, c1: fq0))

var icArr: IC
var counter = 0
for el in vk["IC"]:
let ic = Point[G1](x: FQ.fromString(el[0].str), y: FQ.fromString(el[1].str), z: FQ.fromString("1"))
let ic0 = FQ.fromString(el[0].str)
let ic1 = FQ.fromString(el[1].str)
let ic = Point[G1](x: ic0, y: ic1, z: fq1)
icArr[counter] = ic
counter+=1

Expand All @@ -38,9 +66,24 @@ proc createVerificationKey*(path: string): VerificationKey =
proc createProof*(path: string): Proof =
let proof = parseFile(path)

let a = Point[G1](x: FQ.fromString(proof["pi_a"][0].str), y: FQ.fromString(proof["pi_a"][1].str), z: FQ.fromString("1"))
let b = Point[G2](x: FQ2(c0: FQ.fromString(proof["pi_b"][0][0].str), c1: FQ.fromString(proof["pi_b"][0][1].str)), y: FQ2(c0: FQ.fromString(proof["pi_b"][1][0].str), c1: FQ.fromString(proof["pi_b"][1][1].str)), z: FQ2(c0: FQ.fromString("1"), c1: FQ.fromString("0")))
let c = Point[G1](x: FQ.fromString(proof["pi_c"][0].str), y: FQ.fromString(proof["pi_c"][1].str), z: FQ.fromString("1"))
let fq0 = FQ.fromString("0")
let fq1 = FQ.fromString("1")

let a0 = FQ.fromString(proof["pi_a"][0].str)
let a1 = FQ.fromString(proof["pi_a"][1].str)
let a = Point[G1](x: a0, y: a1, z: fq1)

let b00 = FQ.fromString(proof["pi_b"][0][0].str)
let b01 = FQ.fromString(proof["pi_b"][0][1].str)
let b10 = FQ.fromString(proof["pi_b"][1][0].str)
let b11 = FQ.fromString(proof["pi_b"][1][1].str)
let b0 = FQ2(c0: b00, c1: b01)
let b1 = FQ2(c0: b10, c1: b11)
let b = Point[G2](x: b0, y: b1, z: FQ2(c0: fq1, c1: fq0))

let c0 = FQ.fromString(proof["pi_c"][0].str)
let c1 = FQ.fromString(proof["pi_c"][1].str)
let c = Point[G1](x: c0, y: c1, z: fq1)

Proof(a:a, b:b, c:c)

Expand All @@ -58,7 +101,13 @@ proc createHeader*(pathCurrentHeader: string, updatePath: string, domain: string
var zerosSlotBuffer: array[24, byte]
for i in 0..23:
zerosSlotBuffer[i] = 0
let sha256ofHashes = hashHeaders(currentHeaderHash, newOptimisticHeader, newFinalizedHeader, newExecutionStateRoot, zerosSlotBuffer, currentSlot, domain)
let sha256ofHashes = hashHeaders(currentHeaderHash,
newOptimisticHeader,
newFinalizedHeader,
newExecutionStateRoot,
zerosSlotBuffer,
currentSlot,
domain)

headerFromSeq(@sha256ofHashes)

Expand All @@ -78,26 +127,13 @@ proc makePairsAndVerify*(vk: VerificationKey,

aBPairing == sum

proc VerifyProofByPaths*(pathToKey:string, pathToProof:string, pathToLastUpdate:string, pathToNewUpdate:string, domain:string): bool =
proc verifyProof*(pathToKey:string,
pathToProof:string,
pathToLastUpdate:string,
pathToNewUpdate:string,
domain:string): bool =
let vkey = createVerificationKey(pathToKey)
let proof = createProof(pathToProof)
let header = createHeader(pathToLastUpdate,pathToNewUpdate,domain)

makePairsAndVerify(vkey,proof,header)

# Example data and usage

# let pathToKey = "vendor/eth2-light-client-updates/prater/capella-updates-94/vk.json"
# let pathToProof = "vendor/eth2-light-client-updates/prater/capella-updates-94/proof_5609044_5609069.json"
# let domain = "0x07000000628941ef21d1fe8c7134720add10bb91e3b02c007e0046d2472c6695"
# let pathToLastUpdate = "vendor/eth2-light-client-updates/prater/capella-updates-94/update_5601823_5609044.json"
# let pathToNewUpdate = "vendor/eth2-light-client-updates/prater/capella-updates-94/update_5609044_5609069.json"

# let vkey = createVerificationKey(pathToKey)
# let proof = createProof(pathToProof)
# let header = createHeader(pathToLastUpdate,pathToNewUpdate,domain)

# if makePairsAndVerify(vkey,proof,header):
# echo "Correct update!"
# else:
# echo "Incorrect update!"
185 changes: 57 additions & 128 deletions libs/nim/verify-utils/verify_given_proof_constantine.nim
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import
nimcrypto/[sha2, hash, utils],
../../../contracts/cosmos/verifier-constantine/lib/nim/verify/verify_helpers,
stew/byteutils,
std/[strutils,json]

Expand All @@ -11,7 +11,7 @@ import # constantine imports
constantine/math/config/type_bigint

type
IC* = array[5, ECP_ShortW_Aff[Fp[BN254_Snarks], G1]]
IC* = array[3, ECP_ShortW_Aff[Fp[BN254_Snarks], G1]]

VerificationKey* = object
alpha*: ECP_ShortW_Aff[Fp[BN254_Snarks], G1]
Expand All @@ -22,111 +22,41 @@ type
a*, c*: ECP_ShortW_Aff[Fp[BN254_Snarks], G1]
b*: ECP_ShortW_Aff[Fp2[BN254_Snarks], G2]

Header* = object
head*: Fr[BN254_Snarks]
tail*: Fr[BN254_Snarks]

Input* = object
data*: ECP_ShortW_Aff[Fp[BN254_Snarks], G1]

proc concatArrays*(
currentHeaderHash: array[32, byte], newOptimisticHeader: array[32, byte],
newFinalizedHeader: array[32, byte], newExecutionStateRoot: array[32, byte],
zerosSlotBuffer: array[24, byte], currentSlot: array[8, byte],
domain: array[32, byte]): array[192, byte] =
var res: array[192, byte]
res[0..31] = currentHeaderHash
res[32..63] = newOptimisticHeader
res[64..95] = newFinalizedHeader
res[96..127] = newExecutionStateRoot
res[128..151] = zerosSlotBuffer
res[152..159] = currentSlot
res[160..191] = domain

res

proc hashHeaders*(
currentHeaderHash: array[32, byte], newOptimisticHeader: array[32, byte],
newFinalizedHeader: array[32, byte], newExecutionStateRoot: array[32, byte],
zerosSlotBuffer: array[24, byte], currentSlot: array[8, byte],
domain: array[32, byte]): array[32, byte] =
let concat = (concatArrays(currentHeaderHash, newOptimisticHeader,
newFinalizedHeader, newExecutionStateRoot,
zerosSlotBuffer, currentSlot, domain))


let hash = sha2.sha256.digest(concat)
hash.data

proc TwoOnPower*(power: int): int =
var output = 1
for i in 1..power:
output *= 2
output

proc decToBitArray*(number: int): array[8, int] =
var copyNum = number
var bitmask: array[8, int]
for i in countdown(7,0):
bitmask[7-i] = copyNum div TwoOnPower(i)
copyNum = (copyNum mod TwoOnPower(i))
bitmask

proc bitArrayToByte*(arr: array[8, int]): byte =
var outNum = 0
for i in 0..7:
outNum += TwoOnPower(i)*arr[7-i]
outNum.byte

proc headerFromSeq*(bigNum: seq): Header =
var firstNumInBits: array[256, int]
for i in 0..2:
firstNumInBits[i] = 0

var secondNumInBits: array[256, int]
for i in 0..252:
secondNumInBits[i] = 0

for i in 0..30:
var tempBitArray = decToBitArray(bigNum[i].int)
for j in 0..7:
firstNumInBits[i*8+j+3] = tempBitArray[j]

var tempBitArray = decToBitArray(bigNum[31].int)
for i in 0..4:
firstNumInBits[251+i] = tempBitArray[i]
for i in 5..7:
secondNumInBits[248+i] = tempBitArray[i]

var firstNumInBytes: array[32, byte]
for i in 0..31:
firstNumInBytes[i] = bitArrayToByte([firstNumInBits[i*8],firstNumInBits[i*8+1],firstNumInBits[i*8+2],firstNumInBits[i*8+3],firstNumInBits[i*8+4],firstNumInBits[i*8+5],firstNumInBits[i*8+6],firstNumInBits[i*8+7]])

var secondNumInBytes: array[32, byte]
for i in 0..30:
secondNumInBytes[i] = 0.byte
secondNumInBytes[31] = bitArrayToByte([secondNumInBits[248],secondNumInBits[249],secondNumInBits[250],secondNumInBits[251],secondNumInBits[252],secondNumInBits[253],secondNumInBits[254],secondNumInBits[255]])

var
head: Fr[BN254_Snarks]
tail: Fr[BN254_Snarks]
head.fromHex(toHex(firstNumInBytes))
tail.fromHex(toHex(secondNumInBytes))

Header(head: head, tail: tail)

proc createVerificationKey*(path: string): VerificationKey =
let vk = parseFile(path)

let vkAlpha1 = ECP_ShortW_Aff[Fp[BN254_Snarks], G1].fromHex(BigInt[255].fromDecimal(vk["vk_alpha_1"][0].str).toHex(),BigInt[255].fromDecimal(vk["vk_alpha_1"][1].str).toHex())
let vkBeta2 = ECP_ShortW_Aff[Fp2[BN254_Snarks], G2].fromHex(BigInt[255].fromDecimal(vk["vk_beta_2"][0][0].str).toHex(),BigInt[255].fromDecimal(vk["vk_beta_2"][0][1].str).toHex(),BigInt[255].fromDecimal(vk["vk_beta_2"][1][0].str).toHex(),BigInt[255].fromDecimal(vk["vk_beta_2"][1][1].str).toHex())
let vkGamma2 = ECP_ShortW_Aff[Fp2[BN254_Snarks], G2].fromHex(BigInt[255].fromDecimal(vk["vk_gamma_2"][0][0].str).toHex(),BigInt[255].fromDecimal(vk["vk_gamma_2"][0][1].str).toHex(),BigInt[255].fromDecimal(vk["vk_gamma_2"][1][0].str).toHex(),BigInt[255].fromDecimal(vk["vk_gamma_2"][1][1].str).toHex())
let vkDelta2 = ECP_ShortW_Aff[Fp2[BN254_Snarks], G2].fromHex(BigInt[255].fromDecimal(vk["vk_delta_2"][0][0].str).toHex(),BigInt[255].fromDecimal(vk["vk_delta_2"][0][1].str).toHex(),BigInt[255].fromDecimal(vk["vk_delta_2"][1][0].str).toHex(),BigInt[255].fromDecimal(vk["vk_delta_2"][1][1].str).toHex())
let alpha0 = BigInt[255].fromDecimal(vk["vk_alpha_1"][0].str).toHex()
let alpha1 = BigInt[255].fromDecimal(vk["vk_alpha_1"][1].str).toHex()
let vkAlpha1 = ECP_ShortW_Aff[Fp[BN254_Snarks], G1].fromHex(alpha0, alpha1)

let beta00 = BigInt[255].fromDecimal(vk["vk_beta_2"][0][0].str).toHex()
let beta01 = BigInt[255].fromDecimal(vk["vk_beta_2"][0][1].str).toHex()
let beta10 = BigInt[255].fromDecimal(vk["vk_beta_2"][1][0].str).toHex()
let beta11 = BigInt[255].fromDecimal(vk["vk_beta_2"][1][1].str).toHex()
let vkBeta2 = ECP_ShortW_Aff[Fp2[BN254_Snarks], G2].fromHex(beta00, beta01, beta10, beta11)

let gamma00 = BigInt[255].fromDecimal(vk["vk_gamma_2"][0][0].str).toHex()
let gamma01 = BigInt[255].fromDecimal(vk["vk_gamma_2"][0][1].str).toHex()
let gamma10 = BigInt[255].fromDecimal(vk["vk_gamma_2"][1][0].str).toHex()
let gamma11 = BigInt[255].fromDecimal(vk["vk_gamma_2"][1][1].str).toHex()
let vkGamma2 = ECP_ShortW_Aff[Fp2[BN254_Snarks], G2].fromHex(gamma00, gamma01, gamma10, gamma11)

let delta00 = BigInt[255].fromDecimal(vk["vk_delta_2"][0][0].str).toHex()
let delta01 = BigInt[255].fromDecimal(vk["vk_delta_2"][0][1].str).toHex()
let delta10 = BigInt[255].fromDecimal(vk["vk_delta_2"][1][0].str).toHex()
let delta11 = BigInt[255].fromDecimal(vk["vk_delta_2"][1][1].str).toHex()
let vkDelta2 = ECP_ShortW_Aff[Fp2[BN254_Snarks], G2].fromHex(delta00, delta01, delta10, delta11)

var icArr: IC
var counter = 0
for el in vk["IC"]:
let ic = ECP_ShortW_Aff[Fp[BN254_Snarks], G1].fromHex(BigInt[255].fromDecimal(el[0].str).toHex(),BigInt[255].fromDecimal(el[1].str).toHex())
let ic0 = BigInt[255].fromDecimal(el[0].str).toHex()
let ic1 = BigInt[255].fromDecimal(el[1].str).toHex()
let ic = ECP_ShortW_Aff[Fp[BN254_Snarks], G1].fromHex(ic0, ic1)

icArr[counter] = ic
counter+=1
Expand All @@ -135,11 +65,17 @@ proc createVerificationKey*(path: string): VerificationKey =

proc createProof*(path: string): Proof =
let proof = parseFile(path)

let a = ECP_ShortW_Aff[Fp[BN254_Snarks], G1].fromHex(BigInt[255].fromDecimal(proof["pi_a"][0].str).toHex(),BigInt[255].fromDecimal(proof["pi_a"][1].str).toHex())
let b = ECP_ShortW_Aff[Fp2[BN254_Snarks], G2].fromHex(BigInt[255].fromDecimal(proof["pi_b"][0][0].str).toHex(),BigInt[255].fromDecimal(proof["pi_b"][0][1].str).toHex(),
BigInt[255].fromDecimal(proof["pi_b"][1][0].str).toHex(),BigInt[255].fromDecimal(proof["pi_b"][1][1].str).toHex())
let c = ECP_ShortW_Aff[Fp[BN254_Snarks], G1].fromHex(BigInt[255].fromDecimal(proof["pi_c"][0].str).toHex(),BigInt[255].fromDecimal(proof["pi_c"][1].str).toHex())
let a0 = BigInt[255].fromDecimal(proof["pi_a"][0].str).toHex()
let a1 = BigInt[255].fromDecimal(proof["pi_a"][1].str).toHex()
let a = ECP_ShortW_Aff[Fp[BN254_Snarks], G1].fromHex(a0, a1)
let b00 = BigInt[255].fromDecimal(proof["pi_b"][0][0].str).toHex()
let b01 = BigInt[255].fromDecimal(proof["pi_b"][0][1].str).toHex()
let b10 = BigInt[255].fromDecimal(proof["pi_b"][1][0].str).toHex()
let b11 = BigInt[255].fromDecimal(proof["pi_b"][1][1].str).toHex()
let b = ECP_ShortW_Aff[Fp2[BN254_Snarks], G2].fromHex(b00, b01, b10, b11)
let c0 = BigInt[255].fromDecimal(proof["pi_c"][0].str).toHex()
let c1 = BigInt[255].fromDecimal(proof["pi_c"][1].str).toHex()
let c = ECP_ShortW_Aff[Fp[BN254_Snarks], G1].fromHex(c0, c1)

Proof(a:a, b:b, c:c)

Expand All @@ -157,7 +93,13 @@ proc createHeader*(pathCurrentHeader: string, updatePath: string, domain: string
var zerosSlotBuffer: array[24, byte]
for i in 0..23:
zerosSlotBuffer[i] = 0
let sha256ofHashes = hashHeaders(currentHeaderHash, newOptimisticHeader, newFinalizedHeader, newExecutionStateRoot, zerosSlotBuffer, currentSlot, domain)
let sha256ofHashes = hashHeaders(currentHeaderHash,
newOptimisticHeader,
newFinalizedHeader,
newExecutionStateRoot,
zerosSlotBuffer,
currentSlot,
domain)

headerFromSeq(@sha256ofHashes)

Expand All @@ -172,47 +114,34 @@ proc makePairsAndVerify*(vk: VerificationKey,
fromAffine(ic0Prj, vk.ic[0])
fromAffine(ic1Prj, vk.ic[1])
fromAffine(ic2Prj, vk.ic[2])
scalarMul(ic1Prj,toBig(header.head))
scalarMul(ic2Prj,toBig(header.tail))
scalarMul(ic1Prj, toBig(header.head))
scalarMul(ic2Prj, toBig(header.tail))
ic0Prj += ic1Prj
ic0Prj += ic2Prj
affine(preparedInputs.data,ic0Prj)
affine(preparedInputs.data, ic0Prj)

var aBPairing: Fp12[BN254_Snarks]
pairing_bn[BN254_Snarks](aBPairing,prf.a,prf.b)
pairing_bn[BN254_Snarks](aBPairing, prf.a, prf.b)
var alphaBetaPairing: Fp12[BN254_Snarks]
pairing_bn[BN254_Snarks](alphaBetaPairing,vk.alpha,vk.beta)
pairing_bn[BN254_Snarks](alphaBetaPairing, vk.alpha, vk.beta)
var preparedInputsGammaPairing: Fp12[BN254_Snarks]
pairing_bn[BN254_Snarks](preparedInputsGammaPairing,preparedInputs.data,vk.gamma)
pairing_bn[BN254_Snarks](preparedInputsGammaPairing, preparedInputs.data, vk.gamma)
var proofCVkDeltaPairing: Fp12[BN254_Snarks]
pairing_bn[BN254_Snarks](proofCVkDeltaPairing,prf.c,vk.delta)
pairing_bn[BN254_Snarks](proofCVkDeltaPairing, prf.c, vk.delta)

var sum:Fp12[BN254_Snarks]
prod(sum, alphaBetaPairing, preparedInputsGammaPairing)
prod(sum, sum, proofCVkDeltaPairing)

(sum == aBPairing).bool

proc VerifyProofByPaths*(pathToKey:string, pathToProof:string, pathToLastUpdate:string, pathToNewUpdate:string, domain:string): bool =
proc verifyProofConstantine*(pathToKey:string,
pathToProof:string,
pathToLastUpdate:string,
pathToNewUpdate:string,
domain:string): bool =
let vkey = createVerificationKey(pathToKey)
let proof = createProof(pathToProof)
let header = createHeader(pathToLastUpdate,pathToNewUpdate,domain)

makePairsAndVerify(vkey,proof,header)

# Example data and usage

# let pathToKey = "vendor/eth2-light-client-updates/prater/capella-updates-94/vk.json"
# let pathToProof = "vendor/eth2-light-client-updates/prater/capella-updates-94/proof_5609044_5609069.json"
# let domain = "0x07000000628941ef21d1fe8c7134720add10bb91e3b02c007e0046d2472c6695"
# let pathToLastUpdate = "vendor/eth2-light-client-updates/prater/capella-updates-94/update_5601823_5609044.json"
# let pathToNewUpdate = "vendor/eth2-light-client-updates/prater/capella-updates-94/update_5609044_5609069.json"

# let vkey = createVerificationKey(pathToKey)
# let proof = createProof(pathToProof)
# let header = createHeader(pathToLastUpdate,pathToNewUpdate,domain)

# if makePairsAndVerify(vkey,proof,header):
# echo "Correct update!"
# else:
# echo "Incorrect update!"
makePairsAndVerify(vkey, proof, header)

0 comments on commit e50de22

Please sign in to comment.