Skip to content

Commit 4086f57

Browse files
committed
Fix historical proof verification and add test
1 parent ad8c979 commit 4086f57

File tree

2 files changed

+114
-3
lines changed

2 files changed

+114
-3
lines changed

contracts/contract/util/BeaconStateVerifier.sol

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {BeaconStateVerifierInterface, ValidatorProof, Withdrawal} from "../../in
1010
contract BeaconStateVerifier is RocketBase, BeaconStateVerifierInterface {
1111
// TODO: Decide how to supply these required beacon chain constants
1212
uint256 internal constant SLOTS_PER_HISTORICAL_ROOT = 8192;
13+
uint256 internal constant HISTORICAL_ROOT_OFFSET = 758; // CAPELLA_FORK_EPOCH * 32 / SLOTS_PER_HISTORICAL_ROOT
1314

1415
constructor(RocketStorageInterface _rocketStorageAddress) RocketBase(_rocketStorageAddress) {
1516
version = 1;
@@ -52,7 +53,7 @@ contract BeaconStateVerifier is RocketBase, BeaconStateVerifierInterface {
5253
SSZ.Path memory path = SSZ.from(3, 3); // 0b011 (BeaconBlockHeader -> state_root)
5354
if (isHistorical) {
5455
path = SSZ.concat(path, SSZ.from(27, 6)); // 0b001011 (BeaconState -> historical_summaries)
55-
path = SSZ.concat(path, SSZ.intoVector(uint256(_withdrawalSlot) / SLOTS_PER_HISTORICAL_ROOT, 24)); // historical_summaries -> historical_summaries[n]
56+
path = SSZ.concat(path, SSZ.intoVector(uint256(_withdrawalSlot) / SLOTS_PER_HISTORICAL_ROOT - HISTORICAL_ROOT_OFFSET, 24)); // historical_summaries -> historical_summaries[n]
5657
path = SSZ.concat(path, SSZ.from(0, 1)); // 0b0 (HistoricalSummary -> block_summary_root)
5758
} else {
5859
path = SSZ.concat(path, SSZ.from(5, 6)); // 0b000101 (BeaconState -> block_roots)
@@ -78,7 +79,7 @@ contract BeaconStateVerifier is RocketBase, BeaconStateVerifierInterface {
7879

7980
function isHistoricalProof(uint64 proofSlot, uint64 targetSlot) internal view returns (bool) {
8081
require(proofSlot > targetSlot, "Invalid slot for proof");
81-
return proofSlot + SLOTS_PER_HISTORICAL_ROOT <= targetSlot;
82+
return targetSlot + SLOTS_PER_HISTORICAL_ROOT < proofSlot;
8283
}
8384

8485
function merkleiseWithdrawal(Withdrawal calldata withdrawal) internal view returns (bytes32) {

test/util/verifier-tests.js

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const hre = require('hardhat');
88
const ethers = hre.ethers;
99

1010
export default function() {
11-
describe('BeaconStateVerifier', () => {
11+
describe.only('BeaconStateVerifier', () => {
1212
let owner,
1313
node,
1414
random;
@@ -317,5 +317,115 @@ export default function() {
317317
const result = await beaconStateVerifier.verifyWithdrawal(1308840n, 11825974n, 0n, withdrawal, 11834166n, proof);
318318
assert.equal(result, false, 'Verification succeeded');
319319
});
320+
321+
it(printTitle('BeaconStateVerifier', 'Can verify historical withdrawal'), async () => {
322+
const beaconStateVerifier = await BeaconStateVerifier.deployed();
323+
const blockRoots = await BlockRootsMock.deployed();
324+
325+
const proof = [
326+
"0x74cfc71c3b83d9ebf5efd08392c92a9dda42503dcad6803c73891d9053a70320", "0x93c4b29ead59124360480d4caa9654a5b0fdd65db4ea7a86b16e4b7b83bda95e",
327+
"0xe7fe50fcdea47e2a2f5a3fc124aa511e3509f7a15ba069b1ad498bbbe95b720d", "0x5deacc1ef4e1ce7209c023fec1ef703b2614c01be007c9d840ae16d5fd4a02db",
328+
"0x1000000000000000000000000000000000000000000000000000000000000000", "0x00000c0000000000000000000000000000000000000000000000000000000000",
329+
"0x468ac3f202e83aa85fc823833d1dd7e4c068247229ca20c93e03e09eec71b1f2", "0xdb4a3d44ad1639a5a33df330dacb43b1e9ffae933b39777284cc267cfb3b5e23",
330+
"0x554d7982fbf2b551698286f263c15bac3dab59aec4dad9ab151d65f87d2cebe3", "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c",
331+
"0x78b61adb7dabe11b361c00c4d0ce8bc65ba5b25e986d53dd6c5f384c61407893", "0x969cccd23584b6103d59d51cce0c05c509f3c1c6388dee057aa797464fc156c2",
332+
"0x6dd3b9955d892d92338b19976fd07084bfe88a76c3063482b7f30ee60feb2a58", "0xade691acdbbfaad0986c3207cace76269ccfcbb43a7e7235e5c73034d922ce7b",
333+
"0x0000000000000000000000000000000000000000000000000000000000000000", "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
334+
"0x6f09091e8b0c43ba767483032e44b9f7d188b5ccde3934bc34a13f25025a44fb", "0xdeb1cb883675e814da9c601b922023255ce1ada869d9094b29c63e4ac96cc439",
335+
"0x1a9b340cae67f6d4e0a710df062a1d60c35952905a1159a3e900a854cebb0cd3", "0x65df01553a531d51917456384133ddf678c6c889ce6162de9ea7dbe835564823",
336+
"0x9bdf14859c294df8627ca673abe55e5801b721ce4badb277e234b036439cc8a2", "0x9f980cdfbfaed8bd6dbc14b0e58eea9a78188bee1841289e61b2cb2b9b22e135",
337+
"0x04a9a49769c78c902f06bac0f0f4ab1d20a6f6a963e17d09f8bc8967a8a533c2", "0x9845c6e05b93d780abec431be46ed8693b206d12f826236710a0ab204c15d407",
338+
"0x223fbfd99ba532434d7a901e9571a02ce9abbe7ff8605e098f0377835126298b", "0xaf26da67d02d6cff9fb740177f937f8aa9254f72b1113e22dfe01b7bc32ef2e9",
339+
"0xd3163825b7a6359405907912a8deb6bf9367ce842fe7e84e43d87f331779f816", "0x64f656b7890973e7d6f1a52d2a9965662c6e4d7a70da5b8ea4a719bfbe7221a9",
340+
"0xf4e1a264be26a17650d3135f871c1fa481bdd5b0aec7e23385ea945e32357a88", "0x7c5fe548aa993a78739b599b58480c5e12cdf4ca1ece180d2f98af468bf4ee8b",
341+
"0x678bc097998c1ab127329d2416aa2149f9d61f3e174813f2fcc1c5f3f82dfbbe", "0xa908558027c3e780730442c080ea5e51310bb79f55ea7d65544bc821fff01b9d",
342+
"0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", "0xdc4b1fb0c6da070776aff72f3cabdd69fe1bc80b17510e8389f0fe7b99ec13b4",
343+
"0x45bc0e84058bf2d6e40391a50d54957c151ab001f998119a4a5815b008a0b2de", "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c",
344+
"0x42ac8905f23f1485ab055f9e45c206724a7dfbefc879f6b884f9e0f952a3bfc1", "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1",
345+
"0x02fc550c3883e5fa2c1337af5d47a1ab421de5b139ecd19f16c7e8dcb76a1955", "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193",
346+
"0xbc3c027ad6604c5f99c79faa8fb0756a92f9a23af6eda520d99f6fec48f6cce3", "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b",
347+
"0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f",
348+
"0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784",
349+
"0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
350+
"0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
351+
"0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
352+
"0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
353+
"0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", "0xae02000000000000000000000000000000000000000000000000000000000000",
354+
"0xccf8130000000000000000000000000000000000000000000000000000000000", "0x93293d640cd7e57999f2add8910dd15145c57166082acd081ca2fbbec5cd2cbf",
355+
"0xe1be7bbc04e914d5555f015e7518c9db4668d32be20256b25f54a6094f82c759", "0xc431c70147e808fa3bbd66145251d3678b97f68913d011f0adedb116498ff7ba",
356+
"0x54649e50d85164e2d61f38905ea2f507e51812db6b9582e87d1db86c071b9983", "0x2395c64f50239f14feea5dbe13c65d405e0d4be2d25e8995d8f64b94f83014fc",
357+
"0x032ffdac4b987092a708a481a6aa53c66aa874fe96a9f689031715ffa726fee4", "0xbe6d4ac575061b5182c9112451fdc189c2d3dc3a882b4c06c365e0acded0d600",
358+
"0x6cb1b243918374de6252a32aa24a34e0e40f3df71b7b51e6a59d0e99e9109d2d"
359+
];
360+
361+
const blockRoot = '0xe39be859f0aaa98d1c269252388115284366451b58ed082801593dbbfccd1876';
362+
const slot = 11834166;
363+
await blockRoots.setBlockRoot(slot, blockRoot);
364+
365+
const withdrawal = {
366+
index: 88947435n,
367+
validatorIndex: 688322n,
368+
withdrawalCredentials: '0x42a93a9f5cfda54716c414b6eaf07cf512f46ead',
369+
amountInGwei: 19212998n,
370+
}
371+
372+
const result = await beaconStateVerifier.verifyWithdrawal(688322n, 11813956n, 0n, withdrawal, 11834166n, proof);
373+
assert.equal(result, true, 'Verification failed');
374+
});
375+
376+
it(printTitle('BeaconStateVerifier', 'Fails to verify invalid historical proof'), async () => {
377+
const beaconStateVerifier = await BeaconStateVerifier.deployed();
378+
const blockRoots = await BlockRootsMock.deployed();
379+
380+
const proof = [
381+
"0x74cfc71c3b83d9ebf5efd08392c92a9dda42503dcad6803c73891d9053a70320", "0x93c4b29ead59124360480d4caa9654a5b0fdd65db4ea7a86b16e4b7b83bda95e",
382+
"0xe7fe50fcdea47e2a2f5a3fc124aa511e3509f7a15ba069b1ad498bbbe95b720d", "0x5deacc1ef4e1ce7209c023fec1ef703b2614c01be007c9d840ae16d5fd4a02db",
383+
"0x1000000000000000000000000000000000000000000000000000000000000000", "0x00000c0000000000000000000000000000000000000000000000000000000000",
384+
"0x468ac3f202e83aa85fc823833d1dd7e4c068247229ca20c93e03e09eec71b1f2", "0xdb4a3d44ad1639a5a33df330dacb43b1e9ffae933b39777284cc267cfb3b5e23",
385+
"0x554d7982fbf2b551698286f263c15bac3dab59aec4dad9ab151d65f87d2cebe3", "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c",
386+
"0x78b61adb7dabe11b361c00c4d0ce8bc65ba5b25e986d53dd6c5f384c61407893", "0x969cccd23584b6103d59d51cce0c05c509f3c1c6388dee057aa797464fc156c2",
387+
"0x6dd3b9955d892d92338b19976fd07084bfe88a76c3063482b7f30ee60feb2a58", "0xade691acdbbfaad0986c3207cace76269ccfcbb43a7e7235e5c73034d922ce7b",
388+
"0x0000000000000000000000000000000000000000000000000000000000000000", "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
389+
"0x6f09091e8b0c43ba767483032e44b9f7d188b5ccde3934bc34a13f25025a44fb", "0xdeb1cb883675e814da9c601b922023255ce1ada869d9094b29c63e4ac96cc439",
390+
"0x1a9b340cae67f6d4e0a710df062a1d60c35952905a1159a3e900a854cebb0cd3", "0x65df01553a531d51917456384133ddf678c6c889ce6162de9ea7dbe835564823",
391+
"0x9bdf14859c294df8627ca673abe55e5801b721ce4badb277e234b036439cc8a2", "0x9f980cdfbfaed8bd6dbc14b0e58eea9a78188bee1841289e61b2cb2b9b22e135",
392+
"0x04a9a49769c78c902f06bac0f0f4ab1d20a6f6a963e17d09f8bc8967a8a533c2", "0x9845c6e05b93d780abec431be46ed8693b206d12f826236710a0ab204c15d407",
393+
"0x223fbfd99ba532434d7a901e9571a02ce9abbe7ff8605e098f0377835126298b", "0xaf26da67d02d6cff9fb740177f937f8aa9254f72b1113e22dfe01b7bc32ef2e9",
394+
"0xd3163825b7a6359405907912a8deb6bf9367ce842fe7e84e43d87f331779f816", "0x64f656b7890973e7d6f1a52d2a9965662c6e4d7a70da5b8ea4a719bfbe7221a9",
395+
"0xf4e1a264be26a17650d3135f871c1fa481bdd5b0aec7e23385ea945e32357a88", "0x7c5fe548aa993a78739b599b58480c5e12cdf4ca1ece180d2f98af468bf4ee8b",
396+
"0x678bc097998c1ab127329d2416aa2149f9d61f3e174813f2fcc1c5f3f82dfbbe", "0xa908558027c3e780730442c080ea5e51310bb79f55ea7d65544bc821fff01b9d",
397+
"0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", "0xdc4b1fb0c6da070776aff72f3cabdd69fe1bc80b17510e8389f0fe7b99ec13b4",
398+
"0x45bc0e84058bf2d6e40391a50d54957c151ab001f998119a4a5815b008a0b2de", "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c",
399+
"0x42ac8905f23f1485ab055f9e45c206724a7dfbefc879f6b884f9e0f952a3bfc1", "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1",
400+
"0x02fc550c3883e5fa2c1337af5d47a1ab421de5b139ecd19f16c7e8dcb76a1955", "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193",
401+
"0xbc3c027ad6604c5f99c79faa8fb0756a92f9a23af6eda520d99f6fec48f6cce3", "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b",
402+
"0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f",
403+
"0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784",
404+
"0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
405+
"0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
406+
"0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
407+
"0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
408+
"0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", "0xae02000000000000000000000000000000000000000000000000000000000000",
409+
"0xccf8130000000000000000000000000000000000000000000000000000000000", "0x93293d640cd7e57999f2add8910dd15145c57166082acd081ca2fbbec5cd2cbf",
410+
"0xe1be7bbc04e914d5555f015e7518c9db4668d32be20256b25f54a6094f82c759", "0xc431c70147e808fa3bbd66145251d3678b97f68913d011f0adedb116498ff7ba",
411+
"0x54649e50d85164e2d61f38905ea2f507e51812db6b9582e87d1db86c071b9983", "0x2395c64f50239f14feea5dbe13c65d405e0d4be2d25e8995d8f64b94f83014fc",
412+
"0x032ffdac4b987092a708a481a6aa53c66aa874fe96a9f689031715ffa726fee4", "0xbe6d4ac575061b5182c9112451fdc189c2d3dc3a882b4c06c365e0acded0d600",
413+
"0x6cb1b243918374de6252a32aa24a34e0e40f3df71b7b51e6a59d0e99e9109d2d"
414+
];
415+
416+
const blockRoot = '0xe39be859f0aaa98d1c269252388115284366451b58ed082801593dbbfccd1876';
417+
const slot = 11834166;
418+
await blockRoots.setBlockRoot(slot, blockRoot);
419+
420+
const withdrawal = {
421+
index: 88947435n,
422+
validatorIndex: 688322n,
423+
withdrawalCredentials: '0x42a93a9f5cfda54716c414b6eaf07cf512f46ead',
424+
amountInGwei: 999999999n, // Invalid amount
425+
}
426+
427+
const result = await beaconStateVerifier.verifyWithdrawal(688322n, 11813956n, 0n, withdrawal, 11834166n, proof);
428+
assert.equal(result, false, 'Verification succeeded');
429+
});
320430
});
321431
}

0 commit comments

Comments
 (0)