Skip to content

Benchmark Beefy submitFinal by number of signatures #1457

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
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
4 changes: 4 additions & 0 deletions contracts/foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ ignored_error_codes = [
2394,
]

# To clean up, we disabled 3 signature tests. You can regenerate the test fixtures by setting the environment variable
# SIGNATURE_USAGE_COUNT=3 and enabling these tests again.
no_match_test = "testSubmitWith3SignatureCount*"

evm_version = 'Cancun'

[profile.production]
Expand Down
79 changes: 33 additions & 46 deletions contracts/test/BeefyClient.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ contract BeefyClientTest is Test {
uint8 randaoCommitDelay;
uint8 randaoCommitExpiration;
uint256 minNumRequiredSignatures;
uint256 signatureUsageCount;
uint32 blockNumber;
uint32 prevRandao;
uint32 setSize;
Expand All @@ -27,38 +28,32 @@ contract BeefyClientTest is Test {
bytes32 commitHash;
bytes32 root;
uint256[] bitSetArray;
uint256[] absentBitSetArray;
uint256[] bitfield;
uint256[] absentBitfield;
bytes32 mmrRoot;
uint256[] finalBitfield;
BeefyClient.ValidatorProof[] finalValidatorProofs;
BeefyClient.ValidatorProof[] finalValidatorProofs3SignatureCount;
bytes32[] mmrLeafProofs;
BeefyClient.MMRLeaf mmrLeaf;
uint256 leafProofOrder;
BeefyClient.MMRLeaf emptyLeaf;
bytes32[] emptyLeafProofs;
uint256 emptyLeafProofOrder;
bytes2 mmrRootID = bytes2("mh");
string bitFieldFile0SignatureCount;
string bitFieldFile3SignatureCount;
string bitFieldFile;

function setUp() public {
randaoCommitDelay = uint8(vm.envOr("RANDAO_COMMIT_DELAY", uint256(3)));
randaoCommitExpiration = uint8(vm.envOr("RANDAO_COMMIT_EXP", uint256(8)));
minNumRequiredSignatures = uint8(vm.envOr("MINIMUM_REQUIRED_SIGNATURES", uint256(16)));
minNumRequiredSignatures = uint8(vm.envOr("MINIMUM_REQUIRED_SIGNATURES", uint256(17)));
signatureUsageCount = vm.envOr("SIGNATURE_USAGE_COUNT", uint256(0));
prevRandao = uint32(vm.envOr("PREV_RANDAO", uint256(377)));

string memory beefyCommitmentFile =
string.concat(vm.projectRoot(), "/test/data/beefy-commitment.json");

string memory beefyCommitmentRaw = vm.readFile(beefyCommitmentFile);

bitFieldFile0SignatureCount =
string.concat(vm.projectRoot(), "/test/data/beefy-final-bitfield-0.json");
bitFieldFile3SignatureCount =
string.concat(vm.projectRoot(), "/test/data/beefy-final-bitfield-3.json");
bitFieldFile = string.concat(vm.projectRoot(), "/test/data/beefy-final-bitfield.json");

blockNumber = uint32(beefyCommitmentRaw.readUint(".params.commitment.blockNumber"));
setId = uint32(beefyCommitmentRaw.readUint(".params.commitment.validatorSetID"));
Expand All @@ -74,7 +69,6 @@ contract BeefyClientTest is Test {
setSize = uint32(beefyValidatorSetRaw.readUint(".validatorSetSize"));
root = beefyValidatorSetRaw.readBytes32(".validatorRoot");
bitSetArray = beefyValidatorSetRaw.readUintArray(".participants");
absentBitSetArray = beefyValidatorSetRaw.readUintArray(".absentees");

console.log(
"current validator's merkle root is: %s", Strings.toHexString(uint256(root), 32)
Expand All @@ -85,17 +79,11 @@ contract BeefyClientTest is Test {
);

bitfield = beefyClient.createInitialBitfield(bitSetArray, setSize);
absentBitfield = beefyClient.createInitialBitfield(absentBitSetArray, setSize);

string memory finalProofFile0SignatureCount =
string.concat(vm.projectRoot(), "/test/data/beefy-final-proof-0.json");
string memory finalProofRaw0SignatureCount = vm.readFile(finalProofFile0SignatureCount);
loadFinalProofs(finalProofRaw0SignatureCount, finalValidatorProofs);

string memory finalProofFile3SignatureCount =
string.concat(vm.projectRoot(), "/test/data/beefy-final-proof-3.json");
string memory finalProofRaw3SignatureCount = vm.readFile(finalProofFile3SignatureCount);
loadFinalProofs(finalProofRaw3SignatureCount, finalValidatorProofs3SignatureCount);
string memory finalProofFile =
string.concat(vm.projectRoot(), "/test/data/beefy-final-proof.json");
string memory finalProofRaw = vm.readFile(finalProofFile);
loadFinalProofs(finalProofRaw, finalValidatorProofs);
}

function initialize(uint32 _setId) public returns (BeefyClient.Commitment memory) {
Expand Down Expand Up @@ -145,11 +133,11 @@ contract BeefyClientTest is Test {
function regenerateBitField(string memory bitfieldFile, uint256 numRequiredSignatures)
internal
{
console.log("print initialBitField");
console.log("print initialBitField, length is: %d", bitfield.length);
printBitArray(bitfield);
prevRandao = uint32(vm.envOr("PREV_RANDAO", prevRandao));
finalBitfield = Bitfield.subsample(prevRandao, bitfield, numRequiredSignatures, setSize);
console.log("print finalBitField");
console.log("print finalBitField, length is: %d", finalBitfield.length);
printBitArray(finalBitfield);

string memory finalBitFieldRaw = "";
Expand Down Expand Up @@ -187,7 +175,7 @@ contract BeefyClientTest is Test {
);
}

function testSubmit() public returns (BeefyClient.Commitment memory) {
function testSubmitHappyPath() public returns (BeefyClient.Commitment memory) {
BeefyClient.Commitment memory commitment = initialize(setId);

assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 0);
Expand Down Expand Up @@ -264,7 +252,7 @@ contract BeefyClientTest is Test {
beefyClient.submitFinal(
commitment,
bitfield,
finalValidatorProofs3SignatureCount,
finalValidatorProofs,
emptyLeaf,
emptyLeafProofs,
emptyLeafProofOrder
Expand Down Expand Up @@ -505,7 +493,7 @@ contract BeefyClientTest is Test {
commitPrevRandao();
}

function testSubmitWithHandoverAnd3SignatureCount() public {
function testSubmitWith3SignatureCountAndHandover() public {
//initialize with previous set
BeefyClient.Commitment memory commitment = initialize(setId - 1);

Expand Down Expand Up @@ -537,12 +525,7 @@ contract BeefyClientTest is Test {
createFinalProofs();

beefyClient.submitFinal(
commitment,
bitfield,
finalValidatorProofs3SignatureCount,
mmrLeaf,
mmrLeafProofs,
leafProofOrder
commitment, bitfield, finalValidatorProofs, mmrLeaf, mmrLeafProofs, leafProofOrder
);
assertEq(beefyClient.latestBeefyBlock(), blockNumber);
assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 4);
Expand Down Expand Up @@ -772,22 +755,28 @@ contract BeefyClientTest is Test {

function testSubmitFailWithNotEnoughClaims() public {
BeefyClient.Commitment memory commitment = initialize(setId);
uint256[] memory initialBits = absentBitfield;
uint256[] memory bitSetArray2 = bitSetArray;
// New length is 5 less than two thirds of the validator set
assembly {
mstore(bitSetArray2, 5)
}
uint256[] memory initialBits = beefyClient.createInitialBitfield(bitSetArray2, setSize);
Bitfield.set(initialBits, finalValidatorProofs[0].index);
printBitArray(initialBits);
vm.expectRevert(BeefyClient.NotEnoughClaims.selector);
beefyClient.submitInitial(commitment, initialBits, finalValidatorProofs[0]);
}

function testRegenerateBitField() public {
// Generate a bitfield for signature count 0.
uint256 numRequiredSignatures =
beefyClient.computeNumRequiredSignatures_public(setSize, 0, minNumRequiredSignatures);
regenerateBitField(bitFieldFile0SignatureCount, numRequiredSignatures);
// Generate a bitfield for signature count 3.
numRequiredSignatures =
beefyClient.computeNumRequiredSignatures_public(setSize, 3, minNumRequiredSignatures);
regenerateBitField(bitFieldFile3SignatureCount, numRequiredSignatures);
console.log("validator set size: %d", setSize);
console.log("minimum required signatures: %d", minNumRequiredSignatures);
console.log("signature usage count: %d", signatureUsageCount);
// Generate a bitfield for initialized signature count.
uint256 numRequiredSignatures = beefyClient.computeNumRequiredSignatures_public(
setSize, signatureUsageCount, minNumRequiredSignatures
);
console.log("computed required signatures: %d", numRequiredSignatures);
regenerateBitField(bitFieldFile, numRequiredSignatures);
}

function testFuzzComputeValidatorSetQuorum(uint128 validatorSetLen) public {
Expand All @@ -801,11 +790,9 @@ contract BeefyClientTest is Test {
assertGt(result, 0, "result is greater than zero.");
}

function testFuzzSignatureSamplingRanges(
uint128 validatorSetLen,
uint16 signatureUsageCount,
uint16 minSignatures
) public {
function testFuzzSignatureSamplingRanges(uint128 validatorSetLen, uint16 minSignatures)
public
{
// There must be atleast 1 validator.
vm.assume(validatorSetLen > 0);
// Min signatures must be less than the amount of validators.
Expand Down
9 changes: 0 additions & 9 deletions contracts/test/data/beefy-final-bitfield-0.json

This file was deleted.

9 changes: 0 additions & 9 deletions contracts/test/data/beefy-final-bitfield-3.json

This file was deleted.

10 changes: 10 additions & 0 deletions contracts/test/data/beefy-final-bitfield.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"final": {
"finalBitField": [
904625702432147485716542374701906827243357593404210291148247373534326161412,
904629148882204505376999531341828046050008140282820635025195996585574531088,
18446744623465365520
],
"finalBitFieldRaw": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003020000003200001400000008000020000000800000080000000400008008000402000080080000000000000000080000020000000080044020010000000000100000000000000000000000000000000000000000000000010000008000000010"
}
}
Loading
Loading