Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 17 additions & 10 deletions contracts/src/SettlementProof.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,28 +202,35 @@ const MultisigVerifierProgram = ZkProgram({
'Skipped block'
);

let counter = Field.from(0);
let accumulatedStake = Field.from(0);
let totalStake = Field.from(0);
let list = List.empty();
const signatureMessage = pulsarBlocks.list[i].hash().toFields();

for (let j = 0; j < VALIDATOR_NUMBER; j++) {
const { signature, publicKey } =
const { signature, publicKey, stake } =
signaturePublicKeyMatrix.matrix[i].list[j];
const isValid = signature.verify(publicKey, signatureMessage);
counter = Provable.if(isValid, counter.add(1), counter);

list.push(Poseidon.hash(publicKey.toFields()));
accumulatedStake = Provable.if(
isValid,
accumulatedStake.add(stake),
accumulatedStake
);
totalStake = totalStake.add(stake);

list.push(Poseidon.hash([...publicKey.toFields(), stake]));
}

list.hash.assertEquals(
publicInputs.InitialMerkleListRoot,
"Validator MerkleList hash doesn't match"
);
counter.assertGreaterThanOrEqual(
// Field.from((VALIDATOR_NUMBER * 2) / 3),
Field(VALIDATOR_NUMBER),
'Not enough valid signatures'
);
accumulatedStake
.mul(3)
.assertGreaterThanOrEqual(
totalStake.mul(2),
'Not enough valid signatures (stake < 2/3)'
);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Buraya yorum yaptım ama yanlış github hesabından yapmışım, görünüyor mu sende emin olamadım @umutsatir

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gozukmuyor maalesef :/

}

return {
Expand Down
17 changes: 9 additions & 8 deletions contracts/src/ValidateReduce.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,26 +61,27 @@ const ValidateReduceProgram = ZkProgram({
publicInputs: ValidateReducePublicInput,
signaturePublicKeyList: SignaturePublicKeyList
) {
let counter = Field.from(0);
let accumulatedStake = Field.from(0);
let totalStake = Field.from(0);
let list = List.empty();
const signatureMessage = publicInputs.hash().toFields();

for (let i = 0; i < VALIDATOR_NUMBER; i++) {
const { signature, publicKey } = signaturePublicKeyList.list[i];
const { signature, publicKey, stake } = signaturePublicKeyList.list[i];
const isValid = signature.verify(publicKey, signatureMessage);
counter = Provable.if(isValid, counter.add(1), counter);
accumulatedStake = Provable.if(isValid, accumulatedStake.add(stake), accumulatedStake);
totalStake = totalStake.add(stake);

list.push(Poseidon.hash(publicKey.toFields()));
list.push(Poseidon.hash([...publicKey.toFields(), stake]));
}

list.hash.assertEquals(
publicInputs.merkleListRoot,
"Validator MerkleList hash doesn't match"
);
counter.assertGreaterThanOrEqual(
// Field.from((VALIDATOR_NUMBER * 2) / 3),
Field.from(1),
'Not enough valid signatures'
accumulatedStake.mul(3).assertGreaterThanOrEqual(
totalStake.mul(2),
'Not enough valid signatures (stake < 2/3)'
);
},
},
Expand Down
4 changes: 2 additions & 2 deletions contracts/src/benchmark/benchmark.ts
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ async function main() {

for (let i = 0; i < VALIDATOR_NUMBER; i++) {
const [, publicKey] = activeSet[i % 60];
merkleList.push(Poseidon.hash(publicKey.toFields()));
merkleList.push(Poseidon.hash([...publicKey.toFields(), Field(1)]));
}

logParams();
Expand Down Expand Up @@ -310,7 +310,7 @@ async function main() {

for (let i = 0; i < VALIDATOR_NUMBER; i++) {
const [, publicKey] = activeSet[i];
merkleList.push(Poseidon.hash(publicKey.toFields()));
merkleList.push(Poseidon.hash([...publicKey.toFields(), Field(1)]));
}

if (testEnvironment === 'local') {
Expand Down
2 changes: 1 addition & 1 deletion contracts/src/test/ActionStack.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ describe('Action Stack Proof tests', () => {

for (let i = 0; i < VALIDATOR_NUMBER; i++) {
const [, publicKey] = activeSet[i];
merkleList.push(Poseidon.hash(publicKey.toFields()));
merkleList.push(Poseidon.hash([...publicKey.toFields(), Field(1)]));
}
});

Expand Down
2 changes: 1 addition & 1 deletion contracts/src/test/SettlementContract.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,7 @@ describe('SettlementProof tests', () => {

for (let i = 0; i < VALIDATOR_NUMBER; i++) {
const [, publicKey] = activeSet[i];
merkleList.push(Poseidon.hash(publicKey.toFields()));
merkleList.push(Poseidon.hash([...publicKey.toFields(), Field(1)]));
}

if (testEnvironment === 'local') {
Expand Down
2 changes: 1 addition & 1 deletion contracts/src/test/SettlementProof.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ describe('SettlementProof tests', () => {

for (let i = 0; i < VALIDATOR_NUMBER; i++) {
const [, publicKey] = validatorSet[i];
merkleList.push(Poseidon.hash(publicKey.toFields()));
merkleList.push(Poseidon.hash([...publicKey.toFields(), Field(1)]));
}
});

Expand Down
2 changes: 1 addition & 1 deletion contracts/src/test/ValidateReduce.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ describe('ValidateReduceProof tests', () => {

for (let i = 0; i < VALIDATOR_NUMBER; i++) {
const [, publicKey] = validatorSet[i];
merkleList.push(Poseidon.hash(publicKey.toFields()));
merkleList.push(Poseidon.hash([...publicKey.toFields(), Field(1)]));
}
});

Expand Down
4 changes: 2 additions & 2 deletions contracts/src/test/mock.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { PublicKey, PrivateKey, Poseidon } from 'o1js';
import { PublicKey, PrivateKey, Poseidon, Field } from 'o1js';
import { List } from '../types/common.js';
import { VALIDATOR_NUMBER } from '../utils/constants.js';
export { devnetTestAccounts, validatorSet, testAccounts, mockValidatorList };
Expand Down Expand Up @@ -143,6 +143,6 @@ const testAccounts: Array<[PrivateKey, PublicKey]> = [
const mockValidatorList = validatorSet
.slice(0, VALIDATOR_NUMBER)
.reduce((acc, v) => {
acc.push(Poseidon.hash(v[1].toFields()));
acc.push(Poseidon.hash([...v[1].toFields(), Field(1)]));
return acc;
}, List.empty());
14 changes: 9 additions & 5 deletions contracts/src/types/signaturePubKeyList.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Provable, PublicKey, Signature, Struct } from 'o1js';
import { Field, Provable, PublicKey, Signature, Struct } from 'o1js';
import {
SETTLEMENT_MATRIX_SIZE,
VALIDATOR_NUMBER,
Expand All @@ -9,16 +9,19 @@ export { SignaturePublicKey, SignaturePublicKeyList, SignaturePublicKeyMatrix };
class SignaturePublicKey extends Struct({
signature: Signature,
publicKey: PublicKey,
stake: Field,
}) {}

class SignaturePublicKeyList extends Struct({
list: Provable.Array(SignaturePublicKey, VALIDATOR_NUMBER),
}) {
static fromArray(arr: Array<[Signature, PublicKey]>): SignaturePublicKeyList {
static fromArray(
arr: Array<[Signature, PublicKey, Field]>
): SignaturePublicKeyList {
return new SignaturePublicKeyList({
list: arr.map(
([signature, publicKey]) =>
new SignaturePublicKey({ signature, publicKey })
([signature, publicKey, stake]) =>
new SignaturePublicKey({ signature, publicKey, stake })
),
});
}
Expand All @@ -27,6 +30,7 @@ class SignaturePublicKeyList extends Struct({
return this.list.map((item) => ({
signature: item.signature.toString(),
publicKey: item.publicKey.toString(),
stake: item.stake.toString(),
}));
}
}
Expand All @@ -35,7 +39,7 @@ class SignaturePublicKeyMatrix extends Struct({
matrix: Provable.Array(SignaturePublicKeyList, SETTLEMENT_MATRIX_SIZE),
}) {
static fromArray(
arr: Array<Array<[Signature, PublicKey]>>
arr: Array<Array<[Signature, PublicKey, Field]>>
): SignaturePublicKeyMatrix {
return new SignaturePublicKeyMatrix({
matrix: arr.map((row) => SignaturePublicKeyList.fromArray(row)),
Expand Down
12 changes: 8 additions & 4 deletions contracts/src/utils/testUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ function GenerateSignaturePubKeyList(
}

return SignaturePublicKeyList.fromArray(
signatures.map((signature, i) => [signature, signerSet[i][1]])
signatures.map((signature, i) => [signature, signerSet[i][1], Field(1)])
);
}

Expand All @@ -82,7 +82,7 @@ function GenerateSignaturePubKeyMatrix(
}
return SignaturePublicKeyMatrix.fromArray(
signatureMatrix.map((list) =>
list.list.map((item) => [item.signature, item.publicKey])
list.list.map((item) => [item.signature, item.publicKey, item.stake])
)
);
}
Expand All @@ -100,7 +100,11 @@ function GenerateReducerSignatureList(
}

return SignaturePublicKeyList.fromArray(
signatures.map((signature, i) => [signature, proofGeneratorsList[i][1]])
signatures.map((signature, i) => [
signature,
proofGeneratorsList[i][1],
Field(1),
])
);
}

Expand All @@ -111,7 +115,7 @@ function CreateValidatorMerkleList(

for (let i = 0; i < validatorSet.length; i++) {
const [, publicKey] = validatorSet[i];
merkleList.push(Poseidon.hash(publicKey.toFields()));
merkleList.push(Poseidon.hash([...publicKey.toFields(), Field(1)]));
}

return merkleList;
Expand Down