Skip to content

Commit 4363db2

Browse files
authored
Merge pull request #2793 from keep-network/reading-members-hash-from-dkg
Fetching members hash from dkg result We do not need to read members hash from the groups lib, because the dkg result under challenge has to be the same one that was submitted. Otherwise, the challenge call will be reverted. We can read the members hash from the dkg result instead, which simplifies code.
2 parents 1c4b367 + 4b91293 commit 4363db2

File tree

5 files changed

+43
-49
lines changed

5 files changed

+43
-49
lines changed

solidity/random-beacon/contracts/DKGValidator.sol

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,12 @@ contract DKGValidator {
6363
/// and signatures of operators supporting the result.
6464
/// @param seed seed used to start the DKG and select group members
6565
/// @param startBlock DKG start block
66-
/// @param groupMembersHash Challenged group members hash. Hash must be created
67-
/// by filtering out misbehaved members.
6866
/// @return isValid true if the result is valid, false otherwise
6967
/// @return errorMsg validation error message; empty for a valid result
7068
function validate(
7169
DKG.Result calldata result,
7270
uint256 seed,
73-
uint256 startBlock,
74-
bytes32 groupMembersHash
71+
uint256 startBlock
7572
) external view returns (bool isValid, string memory errorMsg) {
7673
(bool hasValidFields, string memory error) = validateFields(result);
7774
if (!hasValidFields) {
@@ -87,7 +84,7 @@ contract DKGValidator {
8784
}
8885

8986
// At this point all group members and mishbehaved members were verified
90-
if (!validateMembersHash(result, groupMembersHash)) {
87+
if (!validateMembersHash(result)) {
9188
return (false, "Invalid members hash");
9289
}
9390

@@ -252,14 +249,13 @@ contract DKGValidator {
252249
/// @notice Performs validation of hashed group members that actively took
253250
/// part in DKG.
254251
/// @param result DKG result
255-
/// @param actualMembersHash Hashed group members that actively took part in
256-
/// dkg
257252
/// @return true if result's group members hash matches with the one that is
258253
/// challenged.
259-
function validateMembersHash(
260-
DKG.Result calldata result,
261-
bytes32 actualMembersHash
262-
) public view returns (bool) {
254+
function validateMembersHash(DKG.Result calldata result)
255+
public
256+
view
257+
returns (bool)
258+
{
263259
if (result.misbehavedMembersIndices.length > 0) {
264260
// members that generated a group signing key
265261
uint32[] memory groupMembers = new uint32[](
@@ -277,9 +273,9 @@ contract DKGValidator {
277273
}
278274
}
279275

280-
return keccak256(abi.encode(groupMembers)) == actualMembersHash;
276+
return keccak256(abi.encode(groupMembers)) == result.membersHash;
281277
}
282278

283-
return keccak256(abi.encode(result.members)) == actualMembersHash;
279+
return keccak256(abi.encode(result.members)) == result.membersHash;
284280
}
285281
}

solidity/random-beacon/contracts/RandomBeacon.sol

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -622,12 +622,8 @@ contract RandomBeacon is Ownable {
622622
/// @param dkgResult Result to challenge. Must match the submitted result
623623
/// stored during `submitDkgResult`.
624624
function challengeDkgResult(DKG.Result calldata dkgResult) external {
625-
bytes32 membersHash = groups
626-
.getGroup(dkgResult.groupPubKey)
627-
.membersHash;
628-
629625
(bytes32 maliciousResultHash, uint32 maliciousSubmitter) = dkg
630-
.challengeResult(dkgResult, membersHash);
626+
.challengeResult(dkgResult);
631627

632628
uint256 slashingAmount = maliciousDkgResultSlashingAmount;
633629
address maliciousSubmitterAddresses = sortitionPool.getIDOperator(

solidity/random-beacon/contracts/libraries/DKG.sol

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -394,14 +394,9 @@ library DKG {
394394
/// @dev Can be called during a challenge period for the submitted result.
395395
/// @param result Result to challenge. Must match the submitted result
396396
/// stored during `submitResult`.
397-
/// @param groupMembersHash Challenged group members hash.
398397
/// @return maliciousResultHash Hash of the malicious result.
399398
/// @return maliciousSubmitter Identifier of the malicious submitter.
400-
function challengeResult(
401-
Data storage self,
402-
Result calldata result,
403-
bytes32 groupMembersHash
404-
)
399+
function challengeResult(Data storage self, Result calldata result)
405400
external
406401
returns (bytes32 maliciousResultHash, uint32 maliciousSubmitter)
407402
{
@@ -425,12 +420,7 @@ library DKG {
425420
// https://github.com/crytic/slither/issues/982
426421
// slither-disable-next-line unused-return
427422
try
428-
self.dkgValidator.validate(
429-
result,
430-
self.seed,
431-
self.startBlock,
432-
groupMembersHash
433-
)
423+
self.dkgValidator.validate(result, self.seed, self.startBlock)
434424
returns (
435425
// slither-disable-next-line uninitialized-local,variable-scope
436426
bool isValid,

solidity/random-beacon/test/DKGValidator.test.ts

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ describe("DKGValidator", () => {
115115
_signers,
116116
_groupPublicKey,
117117
_misbehaved,
118-
_membersHash
118+
_membersHash?: string
119119
) => {
120120
const dkgResult = await prepareDkgResult(
121121
_groupMembers,
@@ -125,12 +125,11 @@ describe("DKGValidator", () => {
125125
dkgStartBlock
126126
)
127127

128-
const result = await validator.validate(
129-
dkgResult,
130-
dkgSeed,
131-
dkgStartBlock,
132-
_membersHash
133-
)
128+
if (_membersHash) {
129+
dkgResult.membersHash = _membersHash
130+
}
131+
132+
const result = await validator.validate(dkgResult, dkgSeed, dkgStartBlock)
134133

135134
return {
136135
isValid: result[0],
@@ -161,8 +160,7 @@ describe("DKGValidator", () => {
161160
selectedOperators,
162161
selectedOperators,
163162
groupPublicKey,
164-
misbehavedMemberIds,
165-
hashUint32Array(expectedMembersIds)
163+
misbehavedMemberIds
166164
)
167165

168166
expect(result.isValid).to.be.true
@@ -182,8 +180,7 @@ describe("DKGValidator", () => {
182180
selectedOperators,
183181
selectedOperators,
184182
groupPublicKey,
185-
misbehavedMemberIds,
186-
hashUint32Array(expectedMembersIds)
183+
misbehavedMemberIds
187184
)
188185

189186
expect(result.isValid).to.be.true
@@ -201,8 +198,7 @@ describe("DKGValidator", () => {
201198
selectedOperators,
202199
selectedOperators,
203200
groupPublicKey,
204-
misbehavedMemberIds,
205-
hashUint32Array(expectedMembersIds)
201+
misbehavedMemberIds
206202
)
207203

208204
expect(result.isValid).to.be.true
@@ -237,8 +233,7 @@ describe("DKGValidator", () => {
237233
selectedOperators,
238234
selectedOperators,
239235
groupPublicKey,
240-
noMisbehaved,
241-
hashUint32Array(selectedOperators.map((m) => m.id))
236+
noMisbehaved
242237
)
243238

244239
expect(result.isValid).to.be.true
@@ -257,8 +252,7 @@ describe("DKGValidator", () => {
257252
shuffledOperators,
258253
shuffledOperators,
259254
groupPublicKey,
260-
noMisbehaved,
261-
hashUint32Array(selectedOperators.map((m) => m.id))
255+
noMisbehaved
262256
)
263257

264258
expect(result.isValid).to.be.false
@@ -277,8 +271,7 @@ describe("DKGValidator", () => {
277271
selectedOperators,
278272
shuffledOperators,
279273
groupPublicKey,
280-
noMisbehaved,
281-
hashUint32Array(selectedOperators.map((m) => m.id))
274+
noMisbehaved
282275
)
283276

284277
expect(result.isValid).to.be.false

solidity/random-beacon/test/RandomBeacon.GroupCreation.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2454,6 +2454,25 @@ describe("RandomBeacon - Group Creation", () => {
24542454
).to.be.revertedWith("Challenge period has already passed")
24552455
})
24562456
})
2457+
2458+
context(
2459+
"with challenged result not matching the submitted one",
2460+
async () => {
2461+
it("should revert with 'Result under challenge is different than the submitted one'", async () => {
2462+
const modifiedDkgResult: DkgResult = { ...dkgResult }
2463+
const modifiedMembersHash = hashUint32Array(
2464+
dkgResult.members.splice(42, 1)
2465+
)
2466+
modifiedDkgResult.membersHash = modifiedMembersHash
2467+
2468+
await expect(
2469+
randomBeacon.challengeDkgResult(modifiedDkgResult)
2470+
).to.be.revertedWith(
2471+
"Result under challenge is different than the submitted one"
2472+
)
2473+
})
2474+
}
2475+
)
24572476
})
24582477

24592478
context(

0 commit comments

Comments
 (0)