From 41f25a8a40f1a1d2ef62d6a073f98a3c57d23579 Mon Sep 17 00:00:00 2001 From: merkleplant <85061506+pmerkleplant@users.noreply.github.com> Date: Mon, 27 Nov 2023 13:20:55 +0100 Subject: [PATCH] all: v2 refactoring to use feed byte identifier (#23) --- .env.example | 4 +- .gas-snapshot | 134 +-- .gitignore | 3 + CHANGELOG.md | 13 + README.md | 2 +- assets/benchmarks.png | Bin 32949 -> 31124 bytes audits/Cantina@v2.0.0.pdf | Bin 0 -> 521933 bytes docs/Benchmarks.md | 18 +- docs/Invariants.md | 55 +- docs/Management.md | 4 +- docs/Scribe.md | 7 +- foundry.toml | 2 +- script/Scribe.s.sol | 41 +- script/ScribeOptimistic.s.sol | 9 +- script/benchmarks/ScribeBenchmark.s.sol | 32 +- .../ScribeOptimisticBenchmark.s.sol | 32 +- script/benchmarks/run.sh | 4 + script/benchmarks/visualize.py | 6 +- script/chaincheck/IScribeChaincheck.sol | 160 +-- .../IScribeOptimisticChaincheck.sol | 4 - script/dev/ScribeOptimisticTester.s.sol | 30 +- script/dev/ScribeTester.s.sol | 15 +- script/dev/invalid-oppoker.sh | 3 +- script/dev/test-feeds.json | 1024 +++++++++++++++++ script/libs/LibFeed.sol | 110 +- src/IScribe.sol | 100 +- src/IScribeOptimistic.sol | 31 +- src/Scribe.sol | 279 ++--- src/ScribeOptimistic.sol | 66 +- src/libs/LibBytes.sol | 28 - src/libs/LibSchnorrData.sol | 102 -- test/EVMTest.sol | 6 +- test/IScribeOptimisticTest.sol | 254 ++-- test/IScribeTest.sol | 541 ++++----- test/LibBytesTest.sol | 59 - test/LibSchnorrDataTest.sol | 135 --- test/LibSchnorrTest.sol | 18 +- test/LibSecp256k1Test.sol | 8 +- test/Runner.t.sol | 9 - test/inspectable/ScribeInspectable.sol | 16 +- test/invariants/FeedSet.sol | 4 + test/invariants/IScribeInvariantTest.sol | 95 +- test/invariants/ScribeHandler.sol | 75 +- 43 files changed, 1977 insertions(+), 1561 deletions(-) create mode 100644 audits/Cantina@v2.0.0.pdf create mode 100644 script/dev/test-feeds.json delete mode 100644 src/libs/LibBytes.sol delete mode 100644 src/libs/LibSchnorrData.sol delete mode 100644 test/LibBytesTest.sol delete mode 100644 test/LibSchnorrDataTest.sol diff --git a/.env.example b/.env.example index ab17c1c..1fdfe84 100644 --- a/.env.example +++ b/.env.example @@ -34,7 +34,7 @@ export ECDSA_VS="[]" export ECDSA_RS="[]" export ECDSA_SS="[]" ## IScribe::drop -export FEED_INDEX= +export FEED_ID= ## IScribeOptimistic::setOpChallengePeriod export OP_CHALLENGE_PERIOD= ## IScribeOptimistic::setMaxChallengeReward @@ -51,4 +51,4 @@ export TEST_POKE_VAL= export TEST_POKE_AGE= export TEST_SCHNORR_SIGNATURE= export TEST_SCHNORR_COMMITMENT= -export TEST_SCHNORR_SIGNERS_BLOB= +export TEST_SCHNORR_FEED_IDS= diff --git a/.gas-snapshot b/.gas-snapshot index 9fd277d..0adcb5a 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,77 +1,69 @@ -LibBytesTest:test_getByteAtIndex() (gas: 378) LibSecp256k1Test:testVectors_addAffinePoint() (gas: 2502307) LibSecp256k1Test:test_isZeroPoint() (gas: 465) LibSecp256k1Test:test_yParity() (gas: 530) ScribeInvariantTest:invariant_bar_IsNeverZero() (runs: 256, calls: 3840, reverts: 0) -ScribeInvariantTest:invariant_feeds_ImageIsZeroToLengthOfPubKeys() (runs: 256, calls: 3840, reverts: 0) -ScribeInvariantTest:invariant_feeds_LinkToTheirPublicKeys() (runs: 256, calls: 3840, reverts: 0) ScribeInvariantTest:invariant_poke_PokeTimestampsAreStrictlyMonotonicallyIncreasing() (runs: 256, calls: 3840, reverts: 0) -ScribeInvariantTest:invariant_pubKeys_AtIndexZeroIsZeroPoint() (runs: 256, calls: 3840, reverts: 0) -ScribeInvariantTest:invariant_pubKeys_LengthIsStrictlyMonotonicallyIncreasing() (runs: 256, calls: 3840, reverts: 0) -ScribeInvariantTest:invariant_pubKeys_NonZeroPubKeyExistsAtMostOnce() (runs: 256, calls: 3840, reverts: 0) -ScribeInvariantTest:invariant_pubKeys_ZeroPointIsNeverAddedAsPubKey() (runs: 256, calls: 3840, reverts: 0) -ScribeOptimisticTest:test_Deployment() (gas: 59359) -ScribeOptimisticTest:test_afterAuthedAction_1_drop() (gas: 248804) -ScribeOptimisticTest:test_afterAuthedAction_1_setBar() (gas: 295659) -ScribeOptimisticTest:test_afterAuthedAction_1_setChallengePeriod() (gas: 294180) -ScribeOptimisticTest:test_afterAuthedAction_2_drop() (gas: 325741) -ScribeOptimisticTest:test_afterAuthedAction_2_setBar() (gas: 384823) -ScribeOptimisticTest:test_afterAuthedAction_2_setChallengePeriod() (gas: 384423) -ScribeOptimisticTest:test_afterAuthedAction_3_drop() (gas: 251454) -ScribeOptimisticTest:test_afterAuthedAction_3_setBar() (gas: 298843) -ScribeOptimisticTest:test_afterAuthedAction_3_setChallengePeriod() (gas: 298316) -ScribeOptimisticTest:test_afterAuthedAction_4_drop() (gas: 327250) -ScribeOptimisticTest:test_afterAuthedAction_4_setBar() (gas: 386044) -ScribeOptimisticTest:test_afterAuthedAction_4_setChallengePeriod() (gas: 384786) -ScribeOptimisticTest:test_drop_IndexZero() (gas: 44243) -ScribeOptimisticTest:test_drop_Multiple_IsAuthProtected() (gas: 14770) -ScribeOptimisticTest:test_drop_Single_IsAuthProtected() (gas: 12782) -ScribeOptimisticTest:test_latestAnswer_isTollProtected() (gas: 12505) +ScribeInvariantTest:invariant_pubKeys_CannotIndexOutOfBoundsViaUint8Index() (runs: 256, calls: 3840, reverts: 0) +ScribeInvariantTest:invariant_pubKeys_IndexedViaFeedId() (runs: 256, calls: 3840, reverts: 0) +ScribeOptimisticTest:test_Deployment() (gas: 1204337) +ScribeOptimisticTest:test_afterAuthedAction_1_drop() (gas: 202463) +ScribeOptimisticTest:test_afterAuthedAction_1_setBar() (gas: 238545) +ScribeOptimisticTest:test_afterAuthedAction_1_setChallengePeriod() (gas: 237041) +ScribeOptimisticTest:test_afterAuthedAction_2_drop() (gas: 285432) +ScribeOptimisticTest:test_afterAuthedAction_2_setBar() (gas: 325402) +ScribeOptimisticTest:test_afterAuthedAction_2_setChallengePeriod() (gas: 324955) +ScribeOptimisticTest:test_afterAuthedAction_3_drop() (gas: 205138) +ScribeOptimisticTest:test_afterAuthedAction_3_setBar() (gas: 241782) +ScribeOptimisticTest:test_afterAuthedAction_3_setChallengePeriod() (gas: 241184) +ScribeOptimisticTest:test_afterAuthedAction_4_drop() (gas: 286761) +ScribeOptimisticTest:test_afterAuthedAction_4_setBar() (gas: 326467) +ScribeOptimisticTest:test_afterAuthedAction_4_setChallengePeriod() (gas: 325228) +ScribeOptimisticTest:test_drop_Multiple_IsAuthProtected() (gas: 14650) +ScribeOptimisticTest:test_drop_Single_IsAuthProtected() (gas: 13533) +ScribeOptimisticTest:test_latestAnswer_isTollProtected() (gas: 12518) ScribeOptimisticTest:test_latestRoundData_isTollProtected() (gas: 14030) -ScribeOptimisticTest:test_lift_Multiple_FailsIf_ECDSADataInvalid() (gas: 106973) -ScribeOptimisticTest:test_lift_Multiple_FailsIf_MaxFeedsReached() (gas: 20286949) -ScribeOptimisticTest:test_lift_Multiple_IsAuthProtected() (gas: 16490) -ScribeOptimisticTest:test_lift_Single_FailsIf_ECDSADataInvalid() (gas: 22135) -ScribeOptimisticTest:test_lift_Single_FailsIf_MaxFeedsReached() (gas: 19731489) -ScribeOptimisticTest:test_lift_Single_IsAuthProtected() (gas: 12905) -ScribeOptimisticTest:test_opChallenge_FailsIf_CalledSubsequently() (gas: 311729) -ScribeOptimisticTest:test_opChallenge_FailsIf_InvalidSchnorrDataGiven() (gas: 283298) -ScribeOptimisticTest:test_opChallenge_FailsIf_NoOpPokeToChallenge() (gas: 14897) -ScribeOptimisticTest:test_peek_isTollProtected() (gas: 12870) -ScribeOptimisticTest:test_peep_isTollProtected() (gas: 13200) -ScribeOptimisticTest:test_poke_Initial_FailsIf_AgeIsZero() (gas: 242775) -ScribeOptimisticTest:test_readWithAge_isTollProtected() (gas: 12357) -ScribeOptimisticTest:test_read_isTollProtected() (gas: 11823) -ScribeOptimisticTest:test_setBar_FailsIf_BarIsZero() (gas: 11793) -ScribeOptimisticTest:test_setBar_IsAuthProtected() (gas: 13730) -ScribeOptimisticTest:test_setMaxChallengeReward_IsAuthProtected() (gas: 13730) -ScribeOptimisticTest:test_setOpChallengePeriod_DropsFinalizedOpPoke_If_NonFinalizedAfterUpdate() (gas: 299764) -ScribeOptimisticTest:test_setOpChallengePeriod_FailsIf_OpChallengePeriodIsZero() (gas: 11567) -ScribeOptimisticTest:test_setOpChallengePeriod_IsAuthProtected() (gas: 12332) -ScribeOptimisticTest:test_toll_diss_IsAuthProtected() (gas: 13260) -ScribeOptimisticTest:test_toll_kiss_IsAuthProtected() (gas: 12419) -ScribeOptimisticTest:test_tryReadWithAge_isTollProtected() (gas: 13746) -ScribeOptimisticTest:test_tryRead_isTollProtected() (gas: 12986) -ScribeTest:test_Deployment() (gas: 42326) -ScribeTest:test_drop_IndexZero() (gas: 16904) -ScribeTest:test_drop_Multiple_IsAuthProtected() (gas: 13794) -ScribeTest:test_drop_Single_IsAuthProtected() (gas: 12148) -ScribeTest:test_latestAnswer_isTollProtected() (gas: 12092) -ScribeTest:test_latestRoundData_isTollProtected() (gas: 13132) -ScribeTest:test_lift_Multiple_FailsIf_ECDSADataInvalid() (gas: 106626) -ScribeTest:test_lift_Multiple_FailsIf_MaxFeedsReached() (gas: 20286275) -ScribeTest:test_lift_Multiple_IsAuthProtected() (gas: 15605) -ScribeTest:test_lift_Single_FailsIf_ECDSADataInvalid() (gas: 21437) -ScribeTest:test_lift_Single_FailsIf_MaxFeedsReached() (gas: 19732318) -ScribeTest:test_lift_Single_IsAuthProtected() (gas: 12535) -ScribeTest:test_peek_isTollProtected() (gas: 12373) -ScribeTest:test_peep_isTollProtected() (gas: 12461) -ScribeTest:test_poke_Initial_FailsIf_AgeIsZero() (gas: 239335) -ScribeTest:test_readWithAge_isTollProtected() (gas: 11969) -ScribeTest:test_read_isTollProtected() (gas: 11695) -ScribeTest:test_setBar_FailsIf_BarIsZero() (gas: 11392) -ScribeTest:test_setBar_IsAuthProtected() (gas: 12823) -ScribeTest:test_toll_diss_IsAuthProtected() (gas: 12533) -ScribeTest:test_toll_kiss_IsAuthProtected() (gas: 12088) -ScribeTest:test_tryReadWithAge_isTollProtected() (gas: 12871) -ScribeTest:test_tryRead_isTollProtected() (gas: 12287) \ No newline at end of file +ScribeOptimisticTest:test_lift_Multiple_FailsIf_ECDSADataInvalid() (gas: 78843) +ScribeOptimisticTest:test_lift_Multiple_IsAuthProtected() (gas: 16509) +ScribeOptimisticTest:test_lift_Single_FailsIf_ECDSADataInvalid() (gas: 21864) +ScribeOptimisticTest:test_lift_Single_FailsIf_FeedIdAlreadyLifted() (gas: 73859) +ScribeOptimisticTest:test_lift_Single_IsAuthProtected() (gas: 13053) +ScribeOptimisticTest:test_opChallenge_CalldataEncodingAttack() (gas: 1528876) +ScribeOptimisticTest:test_opChallenge_FailsIf_CalledSubsequently() (gas: 256890) +ScribeOptimisticTest:test_opChallenge_FailsIf_InvalidSchnorrDataGiven() (gas: 226291) +ScribeOptimisticTest:test_opChallenge_FailsIf_NoOpPokeToChallenge() (gas: 14879) +ScribeOptimisticTest:test_peek_isTollProtected() (gas: 12886) +ScribeOptimisticTest:test_peep_isTollProtected() (gas: 13216) +ScribeOptimisticTest:test_poke_Initial_FailsIf_AgeIsZero() (gas: 185331) +ScribeOptimisticTest:test_readWithAge_isTollProtected() (gas: 12397) +ScribeOptimisticTest:test_read_isTollProtected() (gas: 11836) +ScribeOptimisticTest:test_setBar_FailsIf_BarIsZero() (gas: 11908) +ScribeOptimisticTest:test_setBar_IsAuthProtected() (gas: 13803) +ScribeOptimisticTest:test_setMaxChallengeReward_IsAuthProtected() (gas: 13698) +ScribeOptimisticTest:test_setOpChallengePeriod_DropsFinalizedOpPoke_If_NonFinalizedAfterUpdate() (gas: 242619) +ScribeOptimisticTest:test_setOpChallengePeriod_FailsIf_OpChallengePeriodIsZero() (gas: 11633) +ScribeOptimisticTest:test_setOpChallengePeriod_IsAuthProtected() (gas: 12393) +ScribeOptimisticTest:test_toll_diss_IsAuthProtected() (gas: 13268) +ScribeOptimisticTest:test_toll_kiss_IsAuthProtected() (gas: 12517) +ScribeOptimisticTest:test_tryReadWithAge_isTollProtected() (gas: 13786) +ScribeOptimisticTest:test_tryRead_isTollProtected() (gas: 13047) +ScribeTest:test_Deployment() (gas: 1185225) +ScribeTest:test_drop_Multiple_IsAuthProtected() (gas: 13643) +ScribeTest:test_drop_Single_IsAuthProtected() (gas: 12648) +ScribeTest:test_latestAnswer_isTollProtected() (gas: 12053) +ScribeTest:test_latestRoundData_isTollProtected() (gas: 13080) +ScribeTest:test_lift_Multiple_FailsIf_ECDSADataInvalid() (gas: 78456) +ScribeTest:test_lift_Multiple_IsAuthProtected() (gas: 15556) +ScribeTest:test_lift_Single_FailsIf_ECDSADataInvalid() (gas: 21117) +ScribeTest:test_lift_Single_FailsIf_FeedIdAlreadyLifted() (gas: 73352) +ScribeTest:test_lift_Single_IsAuthProtected() (gas: 12631) +ScribeTest:test_peek_isTollProtected() (gas: 12337) +ScribeTest:test_peep_isTollProtected() (gas: 12425) +ScribeTest:test_poke_Initial_FailsIf_AgeIsZero() (gas: 181717) +ScribeTest:test_readWithAge_isTollProtected() (gas: 11957) +ScribeTest:test_read_isTollProtected() (gas: 11678) +ScribeTest:test_setBar_FailsIf_BarIsZero() (gas: 11457) +ScribeTest:test_setBar_IsAuthProtected() (gas: 12846) +ScribeTest:test_toll_diss_IsAuthProtected() (gas: 12489) +ScribeTest:test_toll_kiss_IsAuthProtected() (gas: 12156) +ScribeTest:test_tryReadWithAge_isTollProtected() (gas: 12838) +ScribeTest:test_tryRead_isTollProtected() (gas: 12298) \ No newline at end of file diff --git a/.gitignore b/.gitignore index a5677dc..dbce94b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# VSCode settings +.vscode/ + # Compiler files cache/ out/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 86fad36..84a020a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,23 @@ All notable changes to this project will be documented in this file. The format is based on [Common Changelog](https://common-changelog.org/). +[2.0.0]: https://github.com/chronicleprotocol/scribe/releases/tag/v2.0.0 [1.2.0]: https://github.com/chronicleprotocol/scribe/releases/tag/v1.2.0 [1.1.0]: https://github.com/chronicleprotocol/scribe/releases/tag/v1.1.0 [1.0.0]: https://github.com/chronicleprotocol/scribe/releases/tag/v1.0.0 +## [2.0.0] - 2023-11-27 + +### Changed + +- **Breaking** Use 1-byte identifier for feeds based on highest-order byte of their addresses instead of their storage array's index ([#23](https://github.com/chronicleprotocol/scribe/pull/23)) +- **Breaking** Change `IScribe` and `IScribeOptimistic` interfaces to account for new feed identification ([#23](https://github.com/chronicleprotocol/scribe/pull/23)) + +### Fixed + +- DOS vector in `ScribeOptimistic::opPoke` making `ScribeOptimistic::opChallenge` economically unprofitable ([#23](https://github.com/chronicleprotocol/scribe/pull/23)) +- Possibility to successfully `opChallenge` a valid `opPoke` via non-default calldata encoding ([#23](https://github.com/chronicleprotocol/scribe/pull/23)) + ## [1.2.0] - 2023-09-29 ### Added diff --git a/README.md b/README.md index ac417e9..47aefdc 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ $ FOUNDRY_PROFILE=intense forge test # Run all tests in intense mode $ forge test --nmt "FuzzDifferentialOracleSuite" # Run only non-differential fuzz tests ``` -Note that in order to run the whole test suite, i.e. including differential fuzz tests, the oracle-suite's [`schnorr`](https://github.com/chronicleprotocol/oracle-suite) binary needs to be present inside the `bin/` directory. +Note that in order to run the whole test suite, i.e. including differential fuzz tests, the oracle-suite's musig [`schnorr`](https://github.com/chronicleprotocol/musig/tree/master/cmd/schnorr) binary needs to be present inside the `bin/` directory. Lint: diff --git a/assets/benchmarks.png b/assets/benchmarks.png index 2211c8257a1d3ee2b6edfed3e0e6ae110b57c663..de2dec7977d1d980b654ac073da7fd34779286c5 100644 GIT binary patch literal 31124 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 literal 32949 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

IK+}LJ7y36+H=v;$b9eP<_Cu@ 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 rI50{6hS*qZ(>rX diff --git a/audits/Cantina@v2.0.0.pdf b/audits/Cantina@v2.0.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6e039a8eb5c195b93465784e7c852120dcd1e816 GIT binary patch literal 521933 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

JppgDLW-W0N6Uh3JNn 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 152) == id ``` * Only functions `lift` and `drop` may mutate the array's state: ``` - ∀x ∊ uint: preTx(_pubKeys[x]) != postTx(_pubKeys[x]) + ∀id ∊ Uint8: preTx(_pubKeys[id]) != postTx(_pubKeys[id]) → msg.sig ∊ {"lift", "drop"} ``` * Array's state may only be mutated by auth'ed caller: ``` - ∀x ∊ uint: preTx(_pubKeys[x]) != postTx(_pubKeys[x]) - → authed(msg.sender) - ``` - -## `{Scribe, ScribeOptimistic}::_feeds` - -* Image of mapping is `[0, _pubKeys.length)`: - ``` - ∀x ∊ Address: _feeds[x] ∊ [0, _pubKeys.length) - ``` - -* Image of mapping links to feed's public key in `_pubKeys`: - ``` - ∀x ∊ Address: _feeds[x] = y ⋀ y != 0 - → _pubKeys[y].toAddress() == x - ``` - -* Only functions `lift` and `drop` may mutate the mapping's state: - ``` - ∀x ∊ Address: preTx(_feeds[x]) != postTx(_feeds[x]) - → msg.sig ∊ {"lift", "drop"} - ``` - -* Mapping's state may only be mutated by auth'ed caller: - ``` - ∀x ∊ Address: preTx(_feeds[x]) != postTx(_feeds[x]) + ∀id ∊ Uint8: preTx(_pubKeys[id]) != postTx(_pubKeys[id]) → authed(msg.sender) ``` diff --git a/docs/Management.md b/docs/Management.md index 4884f8e..9fcbea0 100644 --- a/docs/Management.md +++ b/docs/Management.md @@ -111,7 +111,7 @@ $ forge script \ Set the following environment variables: -- `FEED_INDEX`: The feed's index +- `FEED_ID`: The feed's id Run: @@ -120,7 +120,7 @@ $ forge script \ --private-key $PRIVATE_KEY \ --broadcast \ --rpc-url $RPC_URL \ - --sig $(cast calldata "drop(address,uint)" $SCRIBE $FEED_INDEX) \ + --sig $(cast calldata "drop(address,uint)" $SCRIBE $FEED_ID) \ -vvv \ script/${SCRIBE_FLAVOUR}.s.sol:${SCRIBE_FLAVOUR}Script ``` diff --git a/docs/Scribe.md b/docs/Scribe.md index 28cad0a..9a29fb9 100644 --- a/docs/Scribe.md +++ b/docs/Scribe.md @@ -50,9 +50,9 @@ For more info, see [`LibSecp256k1::addAffinePoint()`](../src/libs/LibSecp256k1.s The `poke()` function has to receive the set of feeds, i.e. public keys, that participated in the Schnorr multi-signature. -To reduce the calldata load, Scribe does not use type `address`, which uses 20 bytes per feed, but encodes the unique feeds' identifier's byte-wise into a `bytes` type called `signersBlob`. +To reduce the calldata load, Scribe does not use type `address`, which uses 20 bytes per feed, but encodes the feeds' identifier's byte-wise into a `bytes` type called `feedIds`. -For more info, see [`LibSchnorrData.sol`](../src/libs/LibSchnorrData.sol). +A feed's identifier is defined as the highest order byte of the feed's address and can be computed via `uint8(uint(uint160(feedAddress)) >> 152)`. ## Lifting Feeds @@ -60,8 +60,6 @@ Feeds _must_ prove the integrity of their public key by proving the ownership of If public key's would not be verified, the Schnorr signature verification would be vulnerable to rogue-key attacks. For more info, see [`docs/Schnorr.md`](./Schnorr.md#key-aggregation-for-multisignatures). -Also, the number of state-changing `lift()` executions is limited to `type(uint8).max-1`, i.e. 254. After reaching this limit, no further `lift()` calls can be executed. For more info, see [`IScribe.maxFeeds()`](../src/IScribe.sol). - ## Chainlink Compatibility Scribe aims to be partially Chainlink compatible by implementing the most widely, and not deprecated, used functions of the `IChainlinkAggregatorV3` interface. @@ -69,6 +67,7 @@ Scribe aims to be partially Chainlink compatible by implementing the most widely The following `IChainlinkAggregatorV3` functions are provided: - `latestRoundData()` - `decimals()` +- `latestAnswer()` ## Optimistic-Flavored Scribe diff --git a/foundry.toml b/foundry.toml index bcd5f95..0f96259 100644 --- a/foundry.toml +++ b/foundry.toml @@ -12,7 +12,7 @@ via_ir = true extra_output_files = ["metadata", "irOptimized"] # Testing -fuzz = { runs = 10 } +fuzz = { runs = 50 } block_timestamp = 1_680_220_800 # March 31, 2023 at 00:00 GMT [invariant] diff --git a/script/Scribe.s.sol b/script/Scribe.s.sol index 5fb2b22..516ccd2 100644 --- a/script/Scribe.s.sol +++ b/script/Scribe.s.sol @@ -27,7 +27,7 @@ contract ScribeScript is Script { /// @dev Deploys a new Scribe instance via Greenhouse instance `greenhouse` /// and salt `salt` with `initialAuthed` being the address initially - /// auth'ed. + /// auth'ed. Note that zero address is kissed directly after deployment. function deploy( address greenhouse, bytes32 salt, @@ -43,9 +43,11 @@ contract ScribeScript is Script { address deployed = IGreenhouse(greenhouse).addressOf(salt); require(deployed.code.length == 0, "Salt already used"); - // Plant creation code via greenhouse. + // Plant creation code via greenhouse and kiss zero address. vm.startBroadcast(); + require(msg.sender == initialAuthed, "Deployer must be initial auth'ed"); IGreenhouse(greenhouse).plant(salt, creationCode); + IToll(deployed).kiss(address(0)); vm.stopBroadcast(); console2.log("Deployed at", deployed); @@ -88,8 +90,7 @@ contract ScribeScript is Script { require(!pubKey.isZeroPoint(), "Public key cannot be zero point"); require(pubKey.isOnCurve(), "Public key must be valid secp256k1 point"); - bool isFeed; - (isFeed, /*feedIndex*/ ) = IScribe(self).feeds(pubKey.toAddress()); + bool isFeed = IScribe(self).feeds(pubKey.toAddress()); require(!isFeed, "Public key already lifted"); address recovered = @@ -142,9 +143,7 @@ contract ScribeScript is Script { pubKeys[i].isOnCurve(), "Public key must be valid secp256k1 point" ); - bool isFeed; - (isFeed, /*feedIndex*/ ) = - IScribe(self).feeds(pubKeys[i].toAddress()); + bool isFeed = IScribe(self).feeds(pubKeys[i].toAddress()); require(!isFeed, "Public key already lifted"); } @@ -180,15 +179,13 @@ contract ScribeScript is Script { } } - /// @dev Drops feed with index `feedIndex`. - function drop(address self, uint feedIndex) public { - require(feedIndex != 0, "Feed index cannot be zero"); - + /// @dev Drops feed with id `feedId`. + function drop(address self, uint8 feedId) public { vm.startBroadcast(); - IScribe(self).drop(feedIndex); + IScribe(self).drop(feedId); vm.stopBroadcast(); - console2.log("Dropped", feedIndex); + console2.log("Dropped", feedId); } // -- View Functions @@ -314,13 +311,16 @@ contract ScribeScript is Script { /// script/${SCRIBE_FLAVOUR}.s.sol:${SCRIBE_FLAVOUR}Script /// ``` function deactivate(address self) public { - // Get current feeds' indexes. - uint[] memory feedIndexes; - ( /*feeds*/ , feedIndexes) = IScribe(self).feeds(); + // Get lifted feeds and compute their feed ids. + address[] memory feeds = IScribe(self).feeds(); + uint8[] memory feedIds = new uint8[](feeds.length); + for (uint i; i < feeds.length; i++) { + feedIds[i] = uint8(uint(uint160(feeds[i])) >> 152); + } // Drop all feeds. vm.startBroadcast(); - IScribe(self).drop(feedIndexes); + IScribe(self).drop(feedIds); vm.stopBroadcast(); // Create new random private key. @@ -336,12 +336,9 @@ contract ScribeScript is Script { // Lift feed. vm.startBroadcast(); - uint feedIndex = IScribe(self).lift(feed.pubKey, ecdsaData); + IScribe(self).lift(feed.pubKey, ecdsaData); vm.stopBroadcast(); - // Set feed's assigned feedIndex. - feed.index = uint8(feedIndex); - // Set bar to 1. vm.startBroadcast(); IScribe(self).setBar(uint8(1)); @@ -365,7 +362,7 @@ contract ScribeScript is Script { // Drop feed again. vm.startBroadcast(); - IScribe(self).drop(feed.index); + IScribe(self).drop(feed.id); vm.stopBroadcast(); // Set bar to type(uint8).max. diff --git a/script/ScribeOptimistic.s.sol b/script/ScribeOptimistic.s.sol index 54afd15..9121d16 100644 --- a/script/ScribeOptimistic.s.sol +++ b/script/ScribeOptimistic.s.sol @@ -3,6 +3,8 @@ pragma solidity ^0.8.16; import {console2} from "forge-std/console2.sol"; +import {IToll} from "chronicle-std/toll/IToll.sol"; + import {IGreenhouse} from "greenhouse/IGreenhouse.sol"; import {IScribe} from "src/IScribe.sol"; @@ -21,7 +23,8 @@ import {ScribeScript} from "./Scribe.s.sol"; contract ScribeOptimisticScript is ScribeScript { /// @dev Deploys a new ScribeOptimistic instance via Greenhouse instance /// `greenhouse` and salt `salt` with `initialAuthed` being the address - /// initially auth'ed. + /// initially auth'ed. Note that zero address is kissed directly after + /// deployment. function deploy( address greenhouse, bytes32 salt, @@ -37,9 +40,11 @@ contract ScribeOptimisticScript is ScribeScript { address deployed = IGreenhouse(greenhouse).addressOf(salt); require(deployed.code.length == 0, "Salt already used"); - // Plant creation code via greenhouse. + // Plant creation code via greenhouse and kiss zero address. vm.startBroadcast(); + require(msg.sender == initialAuthed, "Deployer must be initial auth'ed"); IGreenhouse(greenhouse).plant(salt, creationCode); + IToll(deployed).kiss(address(0)); vm.stopBroadcast(); console2.log("Deployed at", deployed); diff --git a/script/benchmarks/ScribeBenchmark.s.sol b/script/benchmarks/ScribeBenchmark.s.sol index 8953296..1605d63 100644 --- a/script/benchmarks/ScribeBenchmark.s.sol +++ b/script/benchmarks/ScribeBenchmark.s.sol @@ -107,18 +107,32 @@ contract ScribeBenchmark is Script { scribe.poke(pokeData, schnorrData); } - function _createFeeds(uint amount) + function _createFeeds(uint numberFeeds) internal returns (LibFeed.Feed[] memory) { - uint startPrivKey = 2; - - LibFeed.Feed[] memory feeds = new LibFeed.Feed[](amount); - for (uint i; i < amount; i++) { - feeds[i] = LibFeed.newFeed({ - privKey: startPrivKey + i, - index: uint8(i + 1) - }); + LibFeed.Feed[] memory feeds = new LibFeed.Feed[](numberFeeds); + + // Note to not start with privKey=1. This is because the sum of public + // keys would evaluate to: + // pubKeyOf(1) + pubKeyOf(2) + pubKeyOf(3) + ... + // = pubKeyOf(3) + pubKeyOf(3) + ... + // Note that pubKeyOf(3) would be doubled. Doubling is not supported by + // LibSecp256k1 as this would indicate a double-signing attack. + uint privKey = 2; + uint bloom; + uint ctr; + while (ctr != numberFeeds) { + LibFeed.Feed memory feed = LibFeed.newFeed({privKey: privKey}); + + // Check whether feed with id already created, if not create. + if (bloom & (1 << feed.id) == 0) { + bloom |= 1 << feed.id; + + feeds[ctr++] = feed; + } + + privKey++; } return feeds; diff --git a/script/benchmarks/ScribeOptimisticBenchmark.s.sol b/script/benchmarks/ScribeOptimisticBenchmark.s.sol index 90c0072..8d436f4 100644 --- a/script/benchmarks/ScribeOptimisticBenchmark.s.sol +++ b/script/benchmarks/ScribeOptimisticBenchmark.s.sol @@ -154,18 +154,32 @@ contract ScribeOptimisticBenchmark is Script { opScribe.opPoke(pokeData, schnorrData, ecdsaData); } - function _createFeeds(uint amount) + function _createFeeds(uint numberFeeds) internal returns (LibFeed.Feed[] memory) { - uint startPrivKey = 2; - - LibFeed.Feed[] memory feeds = new LibFeed.Feed[](amount); - for (uint i; i < amount; i++) { - feeds[i] = LibFeed.newFeed({ - privKey: startPrivKey + i, - index: uint8(i + 1) - }); + LibFeed.Feed[] memory feeds = new LibFeed.Feed[](numberFeeds); + + // Note to not start with privKey=1. This is because the sum of public + // keys would evaluate to: + // pubKeyOf(1) + pubKeyOf(2) + pubKeyOf(3) + ... + // = pubKeyOf(3) + pubKeyOf(3) + ... + // Note that pubKeyOf(3) would be doubled. Doubling is not supported by + // LibSecp256k1 as this would indicate a double-signing attack. + uint privKey = 2; + uint bloom; + uint ctr; + while (ctr != numberFeeds) { + LibFeed.Feed memory feed = LibFeed.newFeed({privKey: privKey}); + + // Check whether feed with id already created, if not create. + if (bloom & (1 << feed.id) == 0) { + bloom |= 1 << feed.id; + + feeds[ctr++] = feed; + } + + privKey++; } return feeds; diff --git a/script/benchmarks/run.sh b/script/benchmarks/run.sh index e9bcfd3..a916a64 100755 --- a/script/benchmarks/run.sh +++ b/script/benchmarks/run.sh @@ -78,6 +78,8 @@ run_Scribe 15 run_Scribe 20 run_Scribe 50 run_Scribe 100 +run_Scribe 200 +run_Scribe 255 echo "=== Scribe Optimistic Benchmarks (Printing cost of non-initial opPoke())" run_ScribeOptimistic 5 @@ -86,3 +88,5 @@ run_ScribeOptimistic 15 run_ScribeOptimistic 20 run_ScribeOptimistic 50 run_ScribeOptimistic 100 +run_ScribeOptimistic 200 +run_ScribeOptimistic 255 diff --git a/script/benchmarks/visualize.py b/script/benchmarks/visualize.py index 70b3a13..f94e2ca 100644 --- a/script/benchmarks/visualize.py +++ b/script/benchmarks/visualize.py @@ -7,13 +7,13 @@ import matplotlib.pyplot as plt # Bar configuration -x = [5, 10, 15, 20, 50, 100] +x = [5, 10, 15, 20, 50, 100, 200, 255] # Scribe benchmark results received via `run.sh` -scribe = [79428, 106862, 131834, 158263, 315655, 577919] +scribe = [80280, 105070, 132414, 156983, 314455, 574227, 1096599, 1382810] # ScribeOptimistic benchmark results received via `run.sh` -opScribe = [66462, 66534, 66603, 66663, 67437, 68845] +opScribe = [68815, 68887, 68944, 69004, 69791, 71186, 73630, 74735] # Plotting the benchmark data plt.plot(x, scribe, label='Scribe') diff --git a/script/chaincheck/IScribeChaincheck.sol b/script/chaincheck/IScribeChaincheck.sol index 9d2b202..04acf2e 100644 --- a/script/chaincheck/IScribeChaincheck.sol +++ b/script/chaincheck/IScribeChaincheck.sol @@ -24,10 +24,6 @@ import { /** * @notice IScribe's `chaincheck` Integration Test * - * @dev Note that this `chaincheck` has a runtime of and memory consumption of - * ω(2^#feeds). If the script fails with "EVMError: MemoryLimitOOG", - * increase the memory limit via the `--memory-limit` flag. - * * @dev Config Definition: * * ```json @@ -41,10 +37,6 @@ import { * "", * ... * ], - * "feedIndexes": [ - * 0, - * ... - * ], * "feedPublicKeys": { * "xCoordinates": [ * , @@ -88,9 +80,6 @@ contract IScribeChaincheck is Chaincheck { string[] logs; - // Necessary for check_invariant_PubKeysHaveNoLinearRelationship(). - LibPublicKeyVerifier.PublicKeyVerifier pubKeyVerifier; - function setUp(address self_, string memory config_) public virtual @@ -117,23 +106,18 @@ contract IScribeChaincheck is Chaincheck { check_decimals(); // Liveness: - check_stalenessThreshold(); + check_StalenessThreshold(); // Configurations: check_bar(); check_feeds_AllExpectedFeedsAreLifted(); check_feeds_OnlyExpectedFeedsAreLifted(); - check_feeds_AllExpectedFeedIndexesLinkToCorrectFeed(); check_feeds_AllPublicKeysAreLifted(); check_feeds_PublicKeysCorrectlyOrdered(); // Invariants: + check_invariant_IsReadable(); check_invariant_ZeroPublicKeyIsNotLifted(); - // Note that check is disabled due to heavy memory usage making it - // currently unusable in ci. - // @todo: Try to fix. However, problem is NP hard so most likely need - // more resources in ci or utilize some caching strategy. - //check_invariant_PublicKeysHaveNoLinearRelationship(); check_invariant_BarIsNotZero(); check_invariant_ReadFunctionsReturnSameValue(); @@ -149,7 +133,6 @@ contract IScribeChaincheck is Chaincheck { function check_feeds_ConfigSanity() internal { address[] memory feeds = config.readAddressArray(".IScribe.feeds"); - uint[] memory feedIndexes = config.readUintArray(".IScribe.feedIndexes"); uint[] memory feedPublicKeysXCoordinates = config.readUintArray(".IScribe.feedPublicKeys.xCoordinates"); uint[] memory feedPublicKeysYCoordinates = @@ -157,16 +140,6 @@ contract IScribeChaincheck is Chaincheck { uint wantLen = feeds.length; - if (feedIndexes.length != wantLen) { - logs.push( - string.concat( - StdStyle.red( - "Config error: IScribe.feeds.length != IScribe.feedIndexes.length" - ) - ) - ); - } - if (feedPublicKeysXCoordinates.length != wantLen) { logs.push( string.concat( @@ -226,7 +199,7 @@ contract IScribeChaincheck is Chaincheck { // -- Liveness -- - function check_stalenessThreshold() internal { + function check_StalenessThreshold() internal { uint stalenessThreshold = config.readUint(".IScribe.stalenessThreshold"); // Note to make sure address(this) is tolled. @@ -235,16 +208,9 @@ contract IScribeChaincheck is Chaincheck { vm.prank(IAuth(address(self)).authed()[0]); IToll(address(self)).kiss(addrThis); - // Read val and age. - bool ok; - uint val; + // Read age. uint age; - (ok, val, age) = self.tryReadWithAge(); - - // Check whether value is provided at all. - if (!ok) { - logs.push(StdStyle.red("Read failed")); - } + ( /*ok*/ , /*val*/, age) = self.tryReadWithAge(); // Check whether value's age is older than allowed. if (block.timestamp - age > stalenessThreshold) { @@ -291,8 +257,7 @@ contract IScribeChaincheck is Chaincheck { for (uint i; i < wantFeeds.length; i++) { wantFeed = wantFeeds[i]; - bool isFeed; - (isFeed, /*feedIndex*/ ) = self.feeds(wantFeed); + bool isFeed = self.feeds(wantFeed); if (!isFeed) { logs.push( @@ -311,58 +276,26 @@ contract IScribeChaincheck is Chaincheck { address[] memory wantFeeds = config.readAddressArray(".IScribe.feeds"); // Check that only expected feeds are lifted. - address[] memory gotFeeds; - (gotFeeds, /*feedIndexes*/ ) = self.feeds(); + address[] memory gotFeeds = self.feeds(); for (uint i; i < gotFeeds.length; i++) { + bool found = false; + for (uint j; j < wantFeeds.length; j++) { if (gotFeeds[i] == wantFeeds[j]) { - // Feed is expected, break inner loop. - break; - } - - if (j == wantFeeds.length - 1) { - // Feed not found. - logs.push( - string.concat( - StdStyle.red("Unknown feed lifted:"), - " feed=", - vm.toString(gotFeeds[i]) - ) - ); + found = true; + break; // Found feed. Continue with outer loop. } } - } - } - - function check_feeds_AllExpectedFeedIndexesLinkToCorrectFeed() internal { - address[] memory wantFeeds = config.readAddressArray(".IScribe.feeds"); - uint[] memory wantFeedIndexes = - config.readUintArray(".IScribe.feedIndexes"); - // Check that each feed index links to correct feed. - address wantFeed; - uint wantFeedIndex; - for (uint i; i < wantFeeds.length; i++) { - wantFeed = wantFeeds[i]; - wantFeedIndex = wantFeedIndexes[i]; - - bool isFeed; - uint gotFeedIndex; - (isFeed, gotFeedIndex) = self.feeds(wantFeed); - - if (wantFeedIndex != gotFeedIndex) { + if (!found) { + // Feed not found. logs.push( string.concat( - StdStyle.red("Expected feed index does not match:"), + StdStyle.red("Unknown feed lifted:"), " feed=", - vm.toString(wantFeed), - ", expectedIndex=", - vm.toString(wantFeedIndex), - ", actualIndex=", - vm.toString(gotFeedIndex) + vm.toString(gotFeeds[i]) ) ); - continue; } } } @@ -391,8 +324,7 @@ contract IScribeChaincheck is Chaincheck { // Check that each address derived from public key is lifted. for (uint i; i < addrs.length; i++) { - bool isFeed; - (isFeed, /*feedIndex*/ ) = self.feeds(addrs[i]); + bool isFeed = self.feeds(addrs[i]); if (!isFeed) { logs.push( @@ -445,41 +377,29 @@ contract IScribeChaincheck is Chaincheck { // -- Invariants -- - function check_invariant_ZeroPublicKeyIsNotLifted() internal { - bool isFeed; - (isFeed, /*feedIndex*/ ) = - self.feeds(LibSecp256k1.ZERO_POINT().toAddress()); + function check_invariant_IsReadable() internal { + // Note to make sure address(this) is tolled. + // Do not forget to diss after afterwards again! + address addrThis = address(this); + vm.prank(IAuth(address(self)).authed()[0]); + IToll(address(self)).kiss(addrThis); - if (isFeed) { - logs.push( - StdStyle.red("[INVARIANT BROKEN] Zero public key is lifted") - ); + try self.read() {} + catch { + logs.push(StdStyle.red("[INVARIANT BROKEN] Not readable")); } - } - function check_invariant_PublicKeysHaveNoLinearRelationship() internal { - uint[] memory feedPublicKeysXCoordinates = - config.readUintArray(".IScribe.feedPublicKeys.xCoordinates"); - uint[] memory feedPublicKeysYCoordinates = - config.readUintArray(".IScribe.feedPublicKeys.yCoordinates"); + // Note to diss address(this) again. + vm.prank(IAuth(address(self)).authed()[0]); + IToll(address(self)).diss(addrThis); + } - // Make LibSecp256k1.Point types from coordinates. - LibSecp256k1.Point[] memory pubKeys; - pubKeys = new LibSecp256k1.Point[](feedPublicKeysXCoordinates.length); - for (uint i; i < pubKeys.length; i++) { - pubKeys[i] = LibSecp256k1.Point({ - x: feedPublicKeysXCoordinates[i], - y: feedPublicKeysYCoordinates[i] - }); - } + function check_invariant_ZeroPublicKeyIsNotLifted() internal { + bool isFeed = self.feeds(LibSecp256k1.ZERO_POINT().toAddress()); - bool ok; - (ok, /*set1*/, /*set2*/ ) = pubKeyVerifier.verifyPublicKeys(pubKeys); - if (!ok) { + if (isFeed) { logs.push( - StdStyle.red( - "[INVARIANT BROKEN] Public keys have linear relationship" - ) + StdStyle.red("[INVARIANT BROKEN] Zero public key is lifted") ); } } @@ -586,9 +506,7 @@ contract IScribeChaincheck is Chaincheck { function check_IAuth() internal { // Run IAuth chaincheck. string[] memory authLogs; - (, authLogs) = new IAuthChaincheck() - .setUp(address(self), config) - .run(); + (, authLogs) = new IAuthChaincheck().setUp(address(self), config).run(); // Add logs to own logs. for (uint i; i < authLogs.length; i++) { @@ -599,14 +517,12 @@ contract IScribeChaincheck is Chaincheck { /// @dev Checks the IToll module dependency. function check_IToll() internal { // Run IToll chaincheck. - string[] memory authLogs; - (, authLogs) = new ITollChaincheck() - .setUp(address(self), config) - .run(); + string[] memory tollLogs; + (, tollLogs) = new ITollChaincheck().setUp(address(self), config).run(); // Add logs to own logs. - for (uint i; i < authLogs.length; i++) { - logs.push(authLogs[i]); + for (uint i; i < tollLogs.length; i++) { + logs.push(tollLogs[i]); } } diff --git a/script/chaincheck/IScribeOptimisticChaincheck.sol b/script/chaincheck/IScribeOptimisticChaincheck.sol index 41fbdae..f868550 100644 --- a/script/chaincheck/IScribeOptimisticChaincheck.sol +++ b/script/chaincheck/IScribeOptimisticChaincheck.sol @@ -35,10 +35,6 @@ import {IScribeChaincheck} from "./IScribeChaincheck.sol"; * "", * ... * ], - * "feedIndexes": [ - * 0, - * ... - * ], * "feedPublicKeys": { * "xCoordinates": [ * , diff --git a/script/dev/ScribeOptimisticTester.s.sol b/script/dev/ScribeOptimisticTester.s.sol index 42358ce..b2d7b04 100644 --- a/script/dev/ScribeOptimisticTester.s.sol +++ b/script/dev/ScribeOptimisticTester.s.sol @@ -45,27 +45,21 @@ contract ScribeOptimisticTesterScript is ScribeTesterScript { // Setup feeds. LibFeed.Feed[] memory feeds = new LibFeed.Feed[](privKeys.length); for (uint i; i < feeds.length; i++) { - feeds[i] = - LibFeed.newFeed({privKey: privKeys[i], index: uint8(i + 1)}); + feeds[i] = LibFeed.newFeed({privKey: privKeys[i]}); vm.label( feeds[i].pubKey.toAddress(), string.concat("Feed #", vm.toString(i + 1)) ); - // Update feed's index. - bool isFeed; - uint feedIndex; - (isFeed, feedIndex) = - IScribe(self).feeds(feeds[i].pubKey.toAddress()); + // Verify feed is lifted. + bool isFeed = IScribe(self).feeds(feeds[i].pubKey.toAddress()); require( isFeed, string.concat( "Private key not feed, privKey=", vm.toString(privKeys[i]) ) ); - - feeds[i].index = uint8(feedIndex); } // Create poke data. @@ -125,27 +119,21 @@ contract ScribeOptimisticTesterScript is ScribeTesterScript { // Setup feeds. LibFeed.Feed[] memory feeds = new LibFeed.Feed[](privKeys.length); for (uint i; i < feeds.length; i++) { - feeds[i] = - LibFeed.newFeed({privKey: privKeys[i], index: uint8(i + 1)}); + feeds[i] = LibFeed.newFeed({privKey: privKeys[i]}); vm.label( feeds[i].pubKey.toAddress(), string.concat("Feed #", vm.toString(i + 1)) ); - // Update feed's index. - bool isFeed; - uint feedIndex; - (isFeed, feedIndex) = - IScribe(self).feeds(feeds[i].pubKey.toAddress()); + // Verify feed is lifted. + bool isFeed = IScribe(self).feeds(feeds[i].pubKey.toAddress()); require( isFeed, string.concat( "Private key not feed, privKey=", vm.toString(privKeys[i]) ) ); - - feeds[i].index = uint8(feedIndex); } // Create poke data. @@ -196,7 +184,7 @@ contract ScribeOptimisticTesterScript is ScribeTesterScript { /// --private-key $PRIVATE_KEY \ /// --broadcast \ /// --rpc-url $RPC_URL \ - /// --sig $(cast calldata "opChallenge(address,uint128,uint32,bytes32,address,bytes)" $SCRIBE $TEST_POKE_VAL $TEST_POKE_AGE $TEST_SCHNORR_SIGNATURE $TEST_SCHNORR_COMMITMENT $TEST_SCHNORR_SIGNERS_BLOB) \ + /// --sig $(cast calldata "opChallenge(address,uint128,uint32,bytes32,address,bytes)" $SCRIBE $TEST_POKE_VAL $TEST_POKE_AGE $TEST_SCHNORR_SIGNATURE $TEST_SCHNORR_COMMITMENT $TEST_SCHNORR_FEED_IDS) \ /// -vvv \ /// script/dev/ScribeOptimisticTester.s.sol:ScribeOptimisticTesterScript /// ``` @@ -206,7 +194,7 @@ contract ScribeOptimisticTesterScript is ScribeTesterScript { uint32 age, bytes32 schnorrSignature, address schnorrCommitment, - bytes memory schnorrSignersBlob + bytes memory schnorrFeedIds ) public { // Construct pokeData and schnorrData. IScribe.PokeData memory pokeData; @@ -216,7 +204,7 @@ contract ScribeOptimisticTesterScript is ScribeTesterScript { IScribe.SchnorrData memory schnorrData; schnorrData.signature = schnorrSignature; schnorrData.commitment = schnorrCommitment; - schnorrData.signersBlob = schnorrSignersBlob; + schnorrData.feedIds = schnorrFeedIds; // Create poke message from pokeData. bytes32 pokeMessage = IScribe(self).constructPokeMessage(pokeData); diff --git a/script/dev/ScribeTester.s.sol b/script/dev/ScribeTester.s.sol index d80f386..9412de4 100644 --- a/script/dev/ScribeTester.s.sol +++ b/script/dev/ScribeTester.s.sol @@ -41,8 +41,7 @@ contract ScribeTesterScript is Script { // Setup feeds. LibFeed.Feed[] memory feeds = new LibFeed.Feed[](privKeys.length); for (uint i; i < feeds.length; i++) { - feeds[i] = - LibFeed.newFeed({privKey: privKeys[i], index: uint8(i + 1)}); + feeds[i] = LibFeed.newFeed({privKey: privKeys[i]}); vm.label( feeds[i].pubKey.toAddress(), @@ -93,27 +92,21 @@ contract ScribeTesterScript is Script { // Setup feeds. LibFeed.Feed[] memory feeds = new LibFeed.Feed[](privKeys.length); for (uint i; i < feeds.length; i++) { - feeds[i] = - LibFeed.newFeed({privKey: privKeys[i], index: uint8(i + 1)}); + feeds[i] = LibFeed.newFeed({privKey: privKeys[i]}); vm.label( feeds[i].pubKey.toAddress(), string.concat("Feed #", vm.toString(i + 1)) ); - // Update feed's index. - bool isFeed; - uint feedIndex; - (isFeed, feedIndex) = - IScribe(self).feeds(feeds[i].pubKey.toAddress()); + // Verify feed is lifted. + bool isFeed = IScribe(self).feeds(feeds[i].pubKey.toAddress()); require( isFeed, string.concat( "Private key not feed, privKey=", vm.toString(privKeys[i]) ) ); - - feeds[i].index = uint8(feedIndex); } // Create poke data. diff --git a/script/dev/invalid-oppoker.sh b/script/dev/invalid-oppoker.sh index e5d3ebc..d8abd6a 100755 --- a/script/dev/invalid-oppoker.sh +++ b/script/dev/invalid-oppoker.sh @@ -16,7 +16,8 @@ PRIVATE_KEY= RPC_URL= SCRIBE= -FEED_PRIVATE_KEYS='[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]' +# Feed private keys taken from script/dev/test-feeds.json. +FEED_PRIVATE_KEYS='[2,3,4,5,6,7,8,9,10,11,12,14,15,16,17,18,19,20,21,22]' while true; do # Lift feeds diff --git a/script/dev/test-feeds.json b/script/dev/test-feeds.json new file mode 100644 index 0000000..2045189 --- /dev/null +++ b/script/dev/test-feeds.json @@ -0,0 +1,1024 @@ +{ + "feeds": [ + { + "privKey": 2, + "address": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF" + }, + { + "privKey": 3, + "address": "0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69" + }, + { + "privKey": 4, + "address": "0x1efF47bc3a10a45D4B230B5d10E37751FE6AA718" + }, + { + "privKey": 5, + "address": "0xe1AB8145F7E55DC933d51a18c793F901A3A0b276" + }, + { + "privKey": 6, + "address": "0xE57bFE9F44b819898F47BF37E5AF72a0783e1141" + }, + { + "privKey": 7, + "address": "0xd41c057fd1c78805AAC12B0A94a405c0461A6FBb" + }, + { + "privKey": 8, + "address": "0xF1F6619B38A98d6De0800F1DefC0a6399eB6d30C" + }, + { + "privKey": 9, + "address": "0xF7Edc8FA1eCc32967F827C9043FcAe6ba73afA5c" + }, + { + "privKey": 10, + "address": "0x4CCeBa2d7D2B4fdcE4304d3e09a1fea9fbEb1528" + }, + { + "privKey": 11, + "address": "0x3DA8D322CB2435dA26E9C9fEE670f9fB7Fe74E49" + }, + { + "privKey": 12, + "address": "0xDbc23AE43a150ff8884B02Cea117b22D1c3b9796" + }, + { + "privKey": 14, + "address": "0x5A83529ff76Ac5723A87008c4D9B436AD4CA7d28" + }, + { + "privKey": 15, + "address": "0x8735015837bD10e05d9cf5EA43A2486Bf4Be156F" + }, + { + "privKey": 16, + "address": "0xfaE394561e33e242c551d15D4625309EA4c0B97f" + }, + { + "privKey": 17, + "address": "0x252Dae0A4b9d9b80F504F6418acd2d364C0c59cD" + }, + { + "privKey": 18, + "address": "0x79196B90D1E952C5A43d4847CAA08d50b967c34A" + }, + { + "privKey": 19, + "address": "0x4bd1280852Cadb002734647305AFC1db7ddD6Acb" + }, + { + "privKey": 20, + "address": "0x811da72aCA31e56F770Fc33DF0e45fD08720E157" + }, + { + "privKey": 21, + "address": "0x157bFBEcd023fD6384daD2Bded5DAD7e27Bf92E4" + }, + { + "privKey": 22, + "address": "0x37dA28C050E3c0A1c0aC3BE97913EC038783dA4C" + }, + { + "privKey": 23, + "address": "0x3Bc8287F1D872df4217283b7920D363F13Cf39D8" + }, + { + "privKey": 24, + "address": "0xf4e2B0fcbd0DC4b326d8A52B718A7bb43BdBd072" + }, + { + "privKey": 25, + "address": "0x9a5279029e9A2D6E787c5A09CB068AB3D45e209d" + }, + { + "privKey": 26, + "address": "0xc39677F5F47d5fE65ab24e66750e8FCa127c15BE" + }, + { + "privKey": 27, + "address": "0x1dc728786E09F862E39Be1f39dD218EE37feB68D" + }, + { + "privKey": 28, + "address": "0x636CC65783084b9F370789c90F733DBBeb88925D" + }, + { + "privKey": 29, + "address": "0x4a7A7c2E09209dbE44A582cD92b0eDd7129E74be" + }, + { + "privKey": 30, + "address": "0xA56160A359F2EAa66f5c9df5245542B07339A9a6" + }, + { + "privKey": 31, + "address": "0x6b09D6433a379752157fD1a9E537c5CAe5fa3168" + }, + { + "privKey": 32, + "address": "0x32E77DE0D74a5C7AF861aAEd324c6a4c488142a8" + }, + { + "privKey": 33, + "address": "0x093d49D617a10F26915553255Ec3FEE532d2C12F" + }, + { + "privKey": 34, + "address": "0x138854708D8B603c9b7d4d6e55b6d32D40557F4D" + }, + { + "privKey": 35, + "address": "0x7dc0a40D64d72bb4590652B8f5C687bF7F26400c" + }, + { + "privKey": 36, + "address": "0x9358A525CC25aa571af0BCB5B98fBEAb045a5e36" + }, + { + "privKey": 37, + "address": "0xd8E8EA89D71de89214fA39Ba13bA9FCDDc0d9467" + }, + { + "privKey": 38, + "address": "0xb56eD8f48979e1A948AD129199a600d0562cac51" + }, + { + "privKey": 39, + "address": "0xf65Ac7003E905d72c666bFec1DC0960ecC9d0D6e" + }, + { + "privKey": 41, + "address": "0xf2ADB90aa27a3C61a95C50063B20919d811e1476" + }, + { + "privKey": 42, + "address": "0xae3DfFEE97f92db0201d11CB8877C89738353bCE" + }, + { + "privKey": 43, + "address": "0xEB3025e7aC2764040384316b33476E048961a71F" + }, + { + "privKey": 44, + "address": "0x9e3289708Dc5709926A542fCf260fD4B210461F0" + }, + { + "privKey": 45, + "address": "0x6C23faCE014F20B3ebb65aE96D0D7FF32aB94c17" + }, + { + "privKey": 46, + "address": "0xB83B6241f966B1685C8B2fFce3956E21F35B4DcB" + }, + { + "privKey": 48, + "address": "0x673C638147fe91e4277646d86D5AE82f775EeA5C" + }, + { + "privKey": 53, + "address": "0xe6869CC98283aB53E8a1a5312857Ef0bE9d189FE" + }, + { + "privKey": 55, + "address": "0xa1A625AE13b80A9c48b7C0331C83bc4541aC137f" + }, + { + "privKey": 56, + "address": "0xa33C9D26e1E33b84247dEFCA631c1d30FFc76F5d" + }, + { + "privKey": 57, + "address": "0xF9807a8719AE154E74591CB2d452797707faDF73" + }, + { + "privKey": 59, + "address": "0x366c20b40048556e5682e360997537c3715AcA0e" + }, + { + "privKey": 64, + "address": "0xe0dd44773F7657b11019062879D65F3D9862460c" + }, + { + "privKey": 65, + "address": "0x756Be12856A8F44AB22FdBCbD42B70b843377d09" + }, + { + "privKey": 66, + "address": "0x6f4c950442e1Af093BcfF730381E63Ae9171b87a" + }, + { + "privKey": 67, + "address": "0x4d1Bf28514A4451249908E611366Ec967C3d1558" + }, + { + "privKey": 68, + "address": "0xB0142D883494197B02c6ECE84f571D81bd831124" + }, + { + "privKey": 71, + "address": "0x7a601ffA997cEdE6435aeABf4Fa2091f09e149Ec" + }, + { + "privKey": 72, + "address": "0xa92F4b5c4FddCC37E5139873AC28a4A0a42d68df" + }, + { + "privKey": 73, + "address": "0x850Cc185d6Cae4A7fDFB3dd81F977dD1dF7D6503" + }, + { + "privKey": 74, + "address": "0xB1b7c87e8a0Bf2E7fd1a1C582bd353E4C4529341" + }, + { + "privKey": 75, + "address": "0xFF844Fdb49e00776Ad538Db9EA2f9fA98EC0cAF7" + }, + { + "privKey": 76, + "address": "0x1aC6F9601f2F616badcEa8A0a307e1A3C14767A4" + }, + { + "privKey": 77, + "address": "0xC2aA6271409c10deE630e79df90C968989ccF2B7" + }, + { + "privKey": 78, + "address": "0x883d01EaE6eAAC077e126dDb32CD53550966ED76" + }, + { + "privKey": 79, + "address": "0x127688bBc070DD69a4dB8C3BA5d43909E13d8F77" + }, + { + "privKey": 80, + "address": "0x0b54A50c0409Dab2e63c3566324268ED53Ec019a" + }, + { + "privKey": 81, + "address": "0xafd46e3549CC63d7a240D6177D056857679e6F99" + }, + { + "privKey": 83, + "address": "0xAC32DeF421e36b43629f785Fd04523260E7F2b28" + }, + { + "privKey": 84, + "address": "0xFe6032A0810e90D025a3a39dd29844F964ee102c" + }, + { + "privKey": 85, + "address": "0x5CB6F3E6499D1f068B33351D0CaE4B68cDf501Bf" + }, + { + "privKey": 86, + "address": "0x84B743441B7bDF65cB4293126dB4C1B709d7d95e" + }, + { + "privKey": 89, + "address": "0x2853dC9ca40d012969e25360ccE0D9D326b24a86" + }, + { + "privKey": 90, + "address": "0x802271c02F76701929E1ea772e72783D28e4b60f" + }, + { + "privKey": 91, + "address": "0x7bd2aA0726AC3b9E752b120DE8568E90b0423ae4" + }, + { + "privKey": 93, + "address": "0xA72392cD4be285ab6681dA1bF1C45f0B370Cb7B4" + }, + { + "privKey": 94, + "address": "0xcf484269182Ac2388A4bFE6d19FB0687e3534B7f" + }, + { + "privKey": 95, + "address": "0x994907CB80BfD175F9b0B32672CFDE0091368e2E" + }, + { + "privKey": 97, + "address": "0x440db3AB842910D2a39F4e1be9E017C6823Fb658" + }, + { + "privKey": 99, + "address": "0x24D881139Ee639C2A774B4B1851CB7a9d0fce122" + }, + { + "privKey": 100, + "address": "0xd9A284367b6D3e25A91c91b5A430AF2593886EB9" + }, + { + "privKey": 103, + "address": "0x7231C364597f3BfDB72Cf52b197cc59111e71794" + }, + { + "privKey": 104, + "address": "0x043aEd06383F290Ee28FA02794Ec7215CA099683" + }, + { + "privKey": 105, + "address": "0x0c95931d95694B3ef74071241827C09f25d40620" + }, + { + "privKey": 106, + "address": "0x417f3b59eF57C641283C2300fae0f27fe98D518C" + }, + { + "privKey": 107, + "address": "0xD6B931D8d441B1ec98F55F8Ec8ADb532DC140c78" + }, + { + "privKey": 108, + "address": "0x9220625B1a30680387D542E6b5F753786Ca5530e" + }, + { + "privKey": 110, + "address": "0xB961768b578514Debf079017FF78c47b0A6AdBf6" + }, + { + "privKey": 111, + "address": "0x052b91ad9732D1bcE0dDAe15a4545e5c65D02443" + }, + { + "privKey": 112, + "address": "0x8dF64de79608F0aE9e72ECAe3A400582AeD8101C" + }, + { + "privKey": 113, + "address": "0x0e7B23Cd1fdb7ea3CCC80320AB43843a2f193C36" + }, + { + "privKey": 114, + "address": "0xFBBC41289f834A76e4320aC238512035560467Ee" + }, + { + "privKey": 115, + "address": "0x61E1DA6C7B8B211E6e5Dd921EFe27e73Ad226DAc" + }, + { + "privKey": 117, + "address": "0x2ACf0D6fdaC920081A446868B2f09A8dAc797448" + }, + { + "privKey": 118, + "address": "0x1715eb68AfBA4D516ef1e068b55f5093BB4A2f59" + }, + { + "privKey": 119, + "address": "0x58Bab2f728dc4FC227A4C38CaB2ec93B73B4E828" + }, + { + "privKey": 121, + "address": "0xA01CCA6367A84304b6607B76676C66c360b74741" + }, + { + "privKey": 125, + "address": "0xE8C5025c803F3279D94eA55598E147f601929Bf4" + }, + { + "privKey": 127, + "address": "0xB3087F34EDab33A8182BA29ADEa4D739D9831A94" + }, + { + "privKey": 128, + "address": "0xc6A210606f2EE6e64aFB9584DB054F3476a5Cc66" + }, + { + "privKey": 129, + "address": "0xD01C9d93efC83C00B30f768F832182BEfF65696f" + }, + { + "privKey": 130, + "address": "0x00eDf2d16AfbC028FB1e879559b07997Af79539f" + }, + { + "privKey": 131, + "address": "0xF5d722030D17CA01F2813Af9E7be158D7a037997" + }, + { + "privKey": 133, + "address": "0x0DC8B8eF8457b1e45ac277D65ac5987B547Ba775" + }, + { + "privKey": 134, + "address": "0xdE521346f9327a4314A18B2cda96B2a33603177A" + }, + { + "privKey": 135, + "address": "0x69842e12d6F36f9f93F06086B70795bFc7e02745" + }, + { + "privKey": 136, + "address": "0x9b7BdF6ad17d5fC9a168Acaa24495e52A65f3b79" + }, + { + "privKey": 137, + "address": "0xa2d47D2C42009520075cB15f5855052008d0c44D" + }, + { + "privKey": 139, + "address": "0x839D96957F21E82fBCCA0D42a1f12EF6e1CF82E9" + }, + { + "privKey": 141, + "address": "0xA4f8c598927EaB2f1898F8F2d6F8121578De2344" + }, + { + "privKey": 143, + "address": "0x21289CD01f9f58FC44962B6E213a0fbBd015bEb6" + }, + { + "privKey": 146, + "address": "0x64e582C17Ab7c3b90E171795B504cA3C04108501" + }, + { + "privKey": 148, + "address": "0x5FE015779Fb36006B01f9C5A5DbcAA6FFA56F0c0" + }, + { + "privKey": 150, + "address": "0x271D65AF9a5A7B4cD7AF264f251184c2a4b9e7A3" + }, + { + "privKey": 151, + "address": "0xddf44e34ed40c40624C7B9f20a1030b505a4FAC0" + }, + { + "privKey": 154, + "address": "0x7E9961FA09dd52f945F8143844785cF0E51bb4Ce" + }, + { + "privKey": 155, + "address": "0xf33D2f7d96F92d912Ca8418f9d62eB54c1A9889F" + }, + { + "privKey": 156, + "address": "0xEEc566c793A89f388BbABfC0225183a6a95C4263" + }, + { + "privKey": 157, + "address": "0x2001f8CdCdEEF1bbCC188cA59CF04Fb44133D55a" + }, + { + "privKey": 160, + "address": "0x18Eb36d090eEadF82f3454a6DA690fC398d3EBa1" + }, + { + "privKey": 161, + "address": "0xd2431CA38735C2fd438e2cAa23F094191D89675b" + }, + { + "privKey": 168, + "address": "0xE2A09565167D4e3F826ADeC6bEF82B97e0A4383f" + }, + { + "privKey": 171, + "address": "0x07748403082b29a45abD6C124A37E6B14e6B1803" + }, + { + "privKey": 173, + "address": "0x5181bE40152CAaBa8e123a55b7762755D4e8e416" + }, + { + "privKey": 174, + "address": "0x9481Da7766c043EEfeECC9589ee7ADE61316b0ff" + }, + { + "privKey": 175, + "address": "0x42Aba3530DD1cCb1dda27BFaa7C6a832cfDB4446" + }, + { + "privKey": 184, + "address": "0x8eE8813FB9d41cc58EF87D28b36E948B1234e71d" + }, + { + "privKey": 186, + "address": "0x31eB18Dd6f5A8064Ab750eABb281Cf162f43CCD0" + }, + { + "privKey": 190, + "address": "0x3c1638a25aD7e8c2a84B53b661dD1BD048407E8f" + }, + { + "privKey": 191, + "address": "0x2eeDf8a799B73BC02E4664183eB72422C377153B" + }, + { + "privKey": 192, + "address": "0xcdeF6f23a26F960B53468f497967CE74c026AF52" + }, + { + "privKey": 193, + "address": "0x0A2035683FE5587B0B09DB0e757306aD729FE6c1" + }, + { + "privKey": 197, + "address": "0x556330e8d92912cCf133851BA03abD2DB70Da404" + }, + { + "privKey": 200, + "address": "0x5304FB08724D73f2bB5E04C582407c33cDE6c8d3" + }, + { + "privKey": 203, + "address": "0xD5CC10c45fc0f9f956Acd7559F61EdBFeC9F6C3d" + }, + { + "privKey": 204, + "address": "0x381c7A71035BDb42fB5D77523Df2Ff00d9f9Df1b" + }, + { + "privKey": 205, + "address": "0x45CdbEEA730D8212F451A6A8d0Eb5998B04CccCa" + }, + { + "privKey": 207, + "address": "0x598E94EB5E050045272d8417F6AB363bD874D568" + }, + { + "privKey": 211, + "address": "0x1Cd21f00b58894260f7ABeD65ad23DCe3CeA0226" + }, + { + "privKey": 212, + "address": "0x26324733d604aBb6176cF18e4f4a0624CeedDC09" + }, + { + "privKey": 216, + "address": "0x3F588A72d94d0D0986B112C671c2343320a19386" + }, + { + "privKey": 217, + "address": "0x7cFa9eEE1D752da599211BC8a68d0687708DaBFC" + }, + { + "privKey": 219, + "address": "0xC4ad60337B04fC721912531a52a5D77878293FB9" + }, + { + "privKey": 220, + "address": "0xFc5Ba3041F750f9B6820Ce066C153EB396aAC1ff" + }, + { + "privKey": 224, + "address": "0xf084BbaaBEe1a700a8FAa404027DB620A5Aa0059" + }, + { + "privKey": 225, + "address": "0x602d562b4Ef2544f851587619B56F77a9d965d45" + }, + { + "privKey": 227, + "address": "0x11Eb17B20113AE923D72E52870D40BF59A08B40D" + }, + { + "privKey": 230, + "address": "0x161c2E10407e2A87959C0bae1f342C80EaeA28f3" + }, + { + "privKey": 234, + "address": "0x4F81e991f76276A17cA92a1321f37189b1727F77" + }, + { + "privKey": 235, + "address": "0xBa95e317EAd06b55c8B70276FC63904b3339dFa1" + }, + { + "privKey": 237, + "address": "0x73377d6228266393747eFa710017872d6dd5B9A6" + }, + { + "privKey": 241, + "address": "0x7492EbbC1E7F2838Fc7191eDc031581d5712978A" + }, + { + "privKey": 242, + "address": "0xC0Af3981f9C0dfcB8955Fea07a3e4F23806FAB51" + }, + { + "privKey": 243, + "address": "0x8621Dd642245dF371b584b48c081e8863313A70d" + }, + { + "privKey": 249, + "address": "0xA8CE5C40c4aA9278DdEaA418e775985549960E7A" + }, + { + "privKey": 252, + "address": "0x90f022E3ca8453F5E5765cd3054003b544526eec" + }, + { + "privKey": 254, + "address": "0x0311afD3Bc2Ae250D5f9F2706BAE2eF4164d6912" + }, + { + "privKey": 255, + "address": "0x5044a80bD3eff58302e638018534BbDA8896c48A" + }, + { + "privKey": 263, + "address": "0x14a6E94f5c4F109d31ec0ff3cd002561b2525bcc" + }, + { + "privKey": 269, + "address": "0x702B1E972fE11B34148287785d76928F9a9c3A76" + }, + { + "privKey": 270, + "address": "0x222c1424ad90a40B505Be6dF879189668984a9C8" + }, + { + "privKey": 271, + "address": "0xFdb4750B55B1c21E632F140921b9753a26446e20" + }, + { + "privKey": 273, + "address": "0x718811e2d1170db844d0c5de6D276b299f2916a9" + }, + { + "privKey": 279, + "address": "0x7fBdFba6b300A5F54a71C0a3D047BA8F21610e4a" + }, + { + "privKey": 287, + "address": "0x3AD2A5A73385E48e476386ACccEEea79692ABe2f" + }, + { + "privKey": 288, + "address": "0x4Ec254AD8A448b2773D816083efc5441a2fC8ea4" + }, + { + "privKey": 291, + "address": "0x476C88ED464EFD251a8b18Eb84785F7C46807873" + }, + { + "privKey": 292, + "address": "0x57EF22b9b9C791850FE16b9Fcb79407aCD151478" + }, + { + "privKey": 293, + "address": "0xdA5cceAf028127E7Ce75d841295170C0e7Cb4113" + }, + { + "privKey": 296, + "address": "0x0130c3D5e6Bb374aCa10f0026700c671aE82cd1B" + }, + { + "privKey": 297, + "address": "0xC11B8c4B34d627a40dA72b065d3B67002EE5EC9F" + }, + { + "privKey": 299, + "address": "0xAd3EAF2Bf6361a1138Cd301f65FA19BE86E65f74" + }, + { + "privKey": 301, + "address": "0x3577496a436bC4E85842e8061a287D88B1e73523" + }, + { + "privKey": 305, + "address": "0xD3ff90f011b0160D4d37067E037EABd7d2041663" + }, + { + "privKey": 307, + "address": "0x2c9410ACEfF398dF7eD4e1490c5290a3eA3DF4Fb" + }, + { + "privKey": 308, + "address": "0x6Db15e33e66739809758684e431952b572924ebc" + }, + { + "privKey": 309, + "address": "0xb77b1AeA5601396Ee1f9BEAB2A0825a027422f11" + }, + { + "privKey": 313, + "address": "0xbd68a0e6A1dE1ffE12eBB7783d2f8F7973c8969d" + }, + { + "privKey": 315, + "address": "0xdF5b9234F7ee51FDBEDdB29aF433Aec4083e5f18" + }, + { + "privKey": 319, + "address": "0xD77b6f0AebAC54FB80f7c0064aBFb7114ad89478" + }, + { + "privKey": 320, + "address": "0x8A9D78FaC62b156F810beC0717e1c0eA13aeeB75" + }, + { + "privKey": 321, + "address": "0xBc737ac2Cc40ed40dccfd8746CFcEB719c5ACA12" + }, + { + "privKey": 322, + "address": "0x5EAa383ccd66f65736a01e5219E2e0407737062b" + }, + { + "privKey": 326, + "address": "0x6eeD3A9d19916ba5E21a8f7b4d60d6cA0965C974" + }, + { + "privKey": 334, + "address": "0x2F2F681Ee0b1504500c9962435616E32Aa64dEFd" + }, + { + "privKey": 336, + "address": "0x29A3b098572e6C7A53065Cc0E18eF6d9f474f4fE" + }, + { + "privKey": 338, + "address": "0x1BB93559cfB76098A2c54ea963d88609afd4810A" + }, + { + "privKey": 343, + "address": "0x5D231c7C81EE99907BF6B2FD2947Fa4557de219c" + }, + { + "privKey": 348, + "address": "0x2D5cEfE9dBc4D5274ea00C6b870c11d6f0265c7e" + }, + { + "privKey": 353, + "address": "0x23952e6b6aE9A89FDe6204bE4312cc9E4fE0c59a" + }, + { + "privKey": 357, + "address": "0x560697e82e48323b827F26862be60C5b19c1d2CF" + }, + { + "privKey": 364, + "address": "0xEa6ffDCcf9167E754531553D3F7b743fB296ee72" + }, + { + "privKey": 365, + "address": "0x403398d0775A70a233Cb00551422De5d620b6842" + }, + { + "privKey": 372, + "address": "0x08963ADC118C91aed106aE1987bfd53fc3011249" + }, + { + "privKey": 373, + "address": "0x5B3FCD13cf91f5C1a9724116333A570a2CA2116b" + }, + { + "privKey": 374, + "address": "0xc8ff52ecE34a58D1f56ab25A0D50e6350B44e739" + }, + { + "privKey": 379, + "address": "0xaa7625e14fC367C8Cbc2BaDAB9935e477164520f" + }, + { + "privKey": 385, + "address": "0x46FA34F88b8612006f78F4655aeFa624DdD93e19" + }, + { + "privKey": 386, + "address": "0xF8b10dF973Ce20Ed07E70Eb3AFc9C2E35c06225b" + }, + { + "privKey": 390, + "address": "0x78B59e306274Dd4C0AF3195Fc89350a3dC407dE4" + }, + { + "privKey": 394, + "address": "0xb63bCAf2DF4b621E83caE95A1364b8a0ffb40998" + }, + { + "privKey": 400, + "address": "0x101cA1E6e819Fe852B7C1BFF5cA9eE1820F9d86F" + }, + { + "privKey": 406, + "address": "0x3EfA17AAe19619Ea3a061a50a3dbD5A4657d1267" + }, + { + "privKey": 412, + "address": "0x8b7421B86d9fF375F13416FbB57956d63504fDE9" + }, + { + "privKey": 413, + "address": "0xD1A0Da208fDE814c052222FBE9a0acC5F077b7a0" + }, + { + "privKey": 415, + "address": "0xCed1B0433c1347A750e2035a26ebdBd798992Fe7" + }, + { + "privKey": 419, + "address": "0xC7346965bfeCFa8A065D7C0A55FbCD15d8314E0b" + }, + { + "privKey": 432, + "address": "0x8C6134AcfdfE43Ae1F1c8E6d9e2aa201C2246942" + }, + { + "privKey": 437, + "address": "0xEfb3f853E9666F5d34E001eA27aa10C8C6d7dF16" + }, + { + "privKey": 448, + "address": "0xE75721D039E8D1fEAA9e59b19cE344A2B1eA6751" + }, + { + "privKey": 452, + "address": "0x333fe004b28627eA079682F37eB6102657D9b835" + }, + { + "privKey": 476, + "address": "0xBb8A8FE4f12953a5840C6570d5e836079329BE46" + }, + { + "privKey": 483, + "address": "0xCa7B487EF7E9E78A0462d1870C4Bd75de321f32A" + }, + { + "privKey": 487, + "address": "0x8fF0eb618c061e00a3fAB5Fc9B8a0f2F24547d48" + }, + { + "privKey": 488, + "address": "0xbf4CAB99a68355608Bed736B3B945aCd3C1Ee298" + }, + { + "privKey": 490, + "address": "0xC5229a9Aba6247D2B4ab61954735A972D08A74aF" + }, + { + "privKey": 491, + "address": "0x5415c45e539fa1D0E3b81C12e706F4087a04c16C" + }, + { + "privKey": 496, + "address": "0x98f3E259e91391E7ba7d2F2D0E8D60D9c6dB7E84" + }, + { + "privKey": 500, + "address": "0x3447659E07332bb8D6E2E1985FB12e8fD6175645" + }, + { + "privKey": 512, + "address": "0x06d31BD867343e5A9D8A82b99618253b38f63b8c" + }, + { + "privKey": 536, + "address": "0x022c53567A99D26aAbDd033B4Efef258ED6DD76A" + }, + { + "privKey": 538, + "address": "0x48159CF1F76426b2ac5ad8208e1B3E5517438D43" + }, + { + "privKey": 540, + "address": "0x9510BB587234430871d9246C98Ece4a13Fb9116d" + }, + { + "privKey": 549, + "address": "0x6282DE81b2455222C4B15159b36c03F55d4903D6" + }, + { + "privKey": 570, + "address": "0xAB8ECD9c951F7F57b77b3c4578C7e9c26c4eE8D9" + }, + { + "privKey": 572, + "address": "0xB40d73153EA796AF4e5Eef4626942022aaB84175" + }, + { + "privKey": 595, + "address": "0xEDdE91eD94463c10aC9B0001edCA3C068d8E226b" + }, + { + "privKey": 606, + "address": "0xB2AC99BC1140e9F9211843dAb96374414702A64A" + }, + { + "privKey": 608, + "address": "0xCC7EF4957B0816607eBcE0a00FA5861ACf95E463" + }, + { + "privKey": 625, + "address": "0x5275D06Bc9dE3661783331380a810Da55cD31544" + }, + { + "privKey": 637, + "address": "0xe34ac72Ca84deEdF06f8B3fc74114ADbb5a6c507" + }, + { + "privKey": 638, + "address": "0x1934c9b2AAFd1D902987951858584F80bf2CE77f" + }, + { + "privKey": 647, + "address": "0x76da31D0e141AD2f7b7D8A2a3Eb86C387b02D838" + }, + { + "privKey": 654, + "address": "0xdC249431F31b36439071A2a31B132E3775178cB2" + }, + { + "privKey": 657, + "address": "0x9DB78Ef366F0AB9A7B1C0e12b4371C8C922d2e16" + }, + { + "privKey": 670, + "address": "0x778eC180D7286B8fea84a2d42429965F35ec16F6" + }, + { + "privKey": 671, + "address": "0x0FC4530b8F6FE6e6a73453CDE827b9C695a3ebe5" + }, + { + "privKey": 679, + "address": "0xbEc5c09999375F60f91633a30bfED85440B10496" + }, + { + "privKey": 691, + "address": "0xC92Fb2E3F1a8f9861876ee812DfdEdb3e845D13A" + }, + { + "privKey": 702, + "address": "0x89cDb38D3aAc16f35d280bf8e85261F2Cc1CB082" + }, + { + "privKey": 790, + "address": "0x9fBe67E4A55BebC5A91886CF53963d487EbA5B6C" + }, + { + "privKey": 813, + "address": "0xcb16f249831588C81f80da9995867F27C627e3F2" + }, + { + "privKey": 819, + "address": "0x9CaD951a57D174A8F0A425D5Ee6920415165fdAA" + }, + { + "privKey": 823, + "address": "0xa636D0d79DCecc69Ef6b546aCaC88232867BE2E0" + }, + { + "privKey": 825, + "address": "0x6ae34Ce38B5491A4b2Ec31Fcd9Ff69ba4bBA0e45" + }, + { + "privKey": 836, + "address": "0x493c8bC625ce5Ca0B9cdd1eA9D939757721480eE" + }, + { + "privKey": 844, + "address": "0x300D76C7145753f6f2515f150F39a14A6f198F7F" + }, + { + "privKey": 865, + "address": "0x966F91FCA291e85C7d1024EA27f62d28D8fd3Fd7" + }, + { + "privKey": 878, + "address": "0x91add7f40C5447fE8CfB9Fb3c9A8d19fD644630c" + }, + { + "privKey": 903, + "address": "0x8247CDE48C7e7c4f95dfF6647b566a533934D224" + }, + { + "privKey": 916, + "address": "0x438Ca190209A8E7C14A92198C575Eae3f92152D0" + }, + { + "privKey": 947, + "address": "0xE4682E4379706A7a84fF6c967e7C0816251b8CfB" + }, + { + "privKey": 967, + "address": "0x39eB22b26d5Ef4708Bc9e90fa394d35349E7F583" + }, + { + "privKey": 1011, + "address": "0x657551717B4045e2A31bf4f0Db82f5A131510Aff" + }, + { + "privKey": 1028, + "address": "0x1FD03A5a9408f206065fF7A1788A3045C08A0779" + }, + { + "privKey": 1133, + "address": "0x660CD9db3944358B0FCf191b80Afc3005F3032FE" + }, + { + "privKey": 1216, + "address": "0xec470B5aC4ADfa27577967AE0f6A74fD89f9AFB0" + }, + { + "privKey": 1238, + "address": "0x97c004220a1c96F377C58AFc2ebAb589E25455Ef" + } + ] +} diff --git a/script/libs/LibFeed.sol b/script/libs/LibFeed.sol index 46c81b8..6d31346 100644 --- a/script/libs/LibFeed.sol +++ b/script/libs/LibFeed.sol @@ -28,29 +28,21 @@ library LibFeed { Vm(address(uint160(uint(keccak256("hevm cheat code"))))); /// @dev Feed encapsulates a private key, derived public key, and the - /// public keys index in a Scribe instance. + /// corresponding feed id. struct Feed { uint privKey; LibSecp256k1.Point pubKey; - uint8 index; + uint8 id; } - /// @dev Returns a new feed instance with private key `privKey` and feed - /// index 0. Note that 0 is never a valid index! + /// @dev Returns a new feed instance with private key `privKey`. function newFeed(uint privKey) internal returns (Feed memory) { - return newFeed(privKey, 0); - } + LibSecp256k1.Point memory pubKey = privKey.derivePublicKey(); - /// @dev Returns a new feed instance with private key `privKey` and feed - /// index `index` in a Scribe instance. - function newFeed(uint privKey, uint8 index) - internal - returns (Feed memory) - { return Feed({ privKey: privKey, - pubKey: privKey.derivePublicKey(), - index: index + pubKey: pubKey, + id: uint8(uint(uint160(pubKey.toAddress())) >> 152) }); } @@ -77,7 +69,7 @@ library LibFeed { return IScribe.SchnorrData({ signature: bytes32(signature), commitment: commitment, - signersBlob: abi.encodePacked(self.index) + feedIds: abi.encodePacked(self.id) }); } @@ -94,96 +86,16 @@ library LibFeed { } (uint signature, address commitment) = privKeys.signMessage(message); - // Create signersBlob with sorted indexes. - bytes memory signersBlob; - uint8[] memory sortedIndexes = selfs.getIndexesSortedByAddress(); - for (uint i; i < sortedIndexes.length; i++) { - signersBlob = abi.encodePacked(signersBlob, sortedIndexes[i]); - } - - return IScribe.SchnorrData({ - signature: bytes32(signature), - commitment: commitment, - signersBlob: signersBlob - }); - } - - /// @dev Returns a Schnorr multi-signature (aggregated signature) of type - /// IScribe.SchnorrData signing `message` via `selfs`' private keys. - /// Note that SchnorrData's signersBlob is not ordered and the signature - /// therefore unacceptable for Scribe. - function signSchnorr_withoutOrderingSignerIndexes( - Feed[] memory selfs, - bytes32 message - ) internal returns (IScribe.SchnorrData memory) { - // Create multi-signature. - uint[] memory privKeys = new uint[](selfs.length); + // Create blob of feedIds. + bytes memory feedIds; for (uint i; i < selfs.length; i++) { - privKeys[i] = selfs[i].privKey; - } - (uint signature, address commitment) = privKeys.signMessage(message); - - // Create list of signerIndexes. - uint8[] memory signerIndexes = new uint8[](selfs.length); - for (uint i; i < selfs.length; i++) { - signerIndexes[i] = selfs[i].index; - } - - // Create signersBlob. - bytes memory signersBlob; - for (uint i; i < signerIndexes.length; i++) { - signersBlob = abi.encodePacked(signersBlob, signerIndexes[i]); + feedIds = abi.encodePacked(feedIds, selfs[i].id); } return IScribe.SchnorrData({ signature: bytes32(signature), commitment: commitment, - signersBlob: signersBlob + feedIds: feedIds }); } - - /// @dev Returns the list of `selfs` indexes sorted by `selfs`' addresses. - function getIndexesSortedByAddress(Feed[] memory selfs) - internal - pure - returns (uint8[] memory) - { - // Create array of feeds' indexes. - uint8[] memory indexes = new uint8[](selfs.length); - for (uint i; i < selfs.length; i++) { - indexes[i] = selfs[i].index; - } - - // Create array of feeds' addresses. - address[] memory addrs = new address[](selfs.length); - for (uint i; i < selfs.length; i++) { - addrs[i] = selfs[i].pubKey.toAddress(); - } - - // Sort indexes array based on addresses array. - for (uint i = 1; i < selfs.length; i++) { - for ( - uint j = i; - j > 0 && uint160(addrs[j - 1]) > uint160(addrs[j]); - j-- - ) { - // Swap in indexes array. - { - uint8 tmp = indexes[j]; - indexes[j] = indexes[j - 1]; - indexes[j - 1] = tmp; - } - - // Swap in addresses array. - { - address tmp = addrs[j]; - addrs[j] = addrs[j - 1]; - addrs[j - 1] = tmp; - } - } - } - - // Return sorted list of indexes. - return indexes; - } } diff --git a/src/IScribe.sol b/src/IScribe.sol index d78406e..6d1f6ca 100644 --- a/src/IScribe.sol +++ b/src/IScribe.sol @@ -17,7 +17,7 @@ interface IScribe is IChronicle { struct SchnorrData { bytes32 signature; address commitment; - bytes signersBlob; + bytes feedIds; } /// @dev ECDSAData encapsulates an ECDSA signature. @@ -45,13 +45,13 @@ interface IScribe is IChronicle { /// @param bar The bar security parameter. error BarNotReached(uint8 numberSigners, uint8 bar); - /// @notice Thrown if signature signed by non-feed. - /// @param signer The signer's address not being a feed. - error SignerNotFeed(address signer); + /// @notice Thrown if given feed id invalid. + /// @param feedId The invalid feed id. + error InvalidFeedId(uint8 feedId); - /// @notice Thrown if signer indexes are not encoded so that their - /// addresses are in ascending order. - error SignersNotOrdered(); + /// @notice Thrown if double signing attempted. + /// @param feedId The id of the feed attempting to double sign. + error DoubleSigningAttempted(uint8 feedId); /// @notice Thrown if Schnorr signature verification failed. error SchnorrSignatureInvalid(); @@ -65,18 +65,12 @@ interface IScribe is IChronicle { /// @notice Emitted when new feed lifted. /// @param caller The caller's address. /// @param feed The feed address lifted. - /// @param index The feed's index identifier. - event FeedLifted( - address indexed caller, address indexed feed, uint indexed index - ); + event FeedLifted(address indexed caller, address indexed feed); /// @notice Emitted when feed dropped. /// @param caller The caller's address. /// @param feed The feed address dropped. - /// @param index The feed's index identifier. - event FeedDropped( - address indexed caller, address indexed feed, uint indexed index - ); + event FeedDropped(address indexed caller, address indexed feed); /// @notice Emitted when bar updated. /// @param caller The caller's address. @@ -93,12 +87,6 @@ interface IScribe is IChronicle { view returns (bytes32 feedRegistrationMessage); - /// @notice The maximum number of feed lifts supported. - /// @dev Note that the constraint comes from feed's indexes being encoded as - /// uint8 in SchnorrData.signersBlob. - /// @return maxFeeds The maximum number of feed lifts supported. - function maxFeeds() external view returns (uint maxFeeds); - /// @notice Returns the bar security parameter. /// @return bar The bar security parameter. function bar() external view returns (uint8 bar); @@ -138,6 +126,7 @@ interface IScribe is IChronicle { /// @notice Pokes the oracle. /// @dev Expects `pokeData`'s age to be greater than the timestamp of the /// last successful poke. + /// @dev Expects `pokeData`'s age to not be greater than the current time. /// @dev Expects `schnorrData` to prove `pokeData`'s integrity. /// See `isAcceptableSchnorrSignatureNow(bytes32,SchnorrData)(bool)`. /// @param pokeData The PokeData being poked. @@ -150,7 +139,7 @@ interface IScribe is IChronicle { /// currently acceptable for message `message`. /// @dev Note that a valid Schnorr signature is only acceptable if the /// signature was signed by exactly bar many feeds. - /// For more info, see `bar()(uint8)` and `feeds()(address[],uint[])`. + /// For more info, see `bar()(uint8)` and `feeds()(address[])`. /// @dev Note that bar and feeds are configurable, meaning a once acceptable /// Schnorr signature may become unacceptable in the future. /// @param message The message expected to be signed via `schnorrData`. @@ -167,73 +156,66 @@ interface IScribe is IChronicle { /// @dev The message is defined as: /// H(tag ‖ H(wat ‖ pokeData)), where H() is the keccak256 function. /// @param pokeData The pokeData to create the message for. - /// @return Message for `pokeData`. + /// @return pokeMessage Message for `pokeData`. function constructPokeMessage(PokeData calldata pokeData) external view - returns (bytes32); + returns (bytes32 pokeMessage); - /// @notice Returns whether address `who` is a feed and its feed index - /// identifier. + /// @notice Returns whether address `who` is a feed. /// @param who The address to check. /// @return isFeed True if `who` is feed, false otherwise. - /// @return feedIndex Non-zero if `who` is feed, zero otherwise. - function feeds(address who) - external - view - returns (bool isFeed, uint feedIndex); - - /// @notice Returns whether feedIndex `index` maps to a feed and, if so, - /// the feed's address. - /// @param index The feedIndex to check. - /// @return isFeed True if `index` maps to a feed, false otherwise. - /// @return feed Address of the feed with feedIndex `index` if `index` maps - /// to feed, zero-address otherwise. - function feeds(uint index) + function feeds(address who) external view returns (bool isFeed); + + /// @notice Returns whether feed id `feedId` is a feed and, if so, the + /// feed's address. + /// @param feedId The feed id to check. + /// @return isFeed True if `feedId` is a feed, false otherwise. + /// @return feed Address of the feed with id `feedId` if `feedId` is a feed, + /// zero-address otherwise. + function feeds(uint8 feedId) external view returns (bool isFeed, address feed); - /// @notice Returns list of feed addresses and their index identifiers. + /// @notice Returns list of feed addresses. + /// @dev Note that this function has a high gas consumption and is not + /// intended to be called onchain. /// @return feeds List of feed addresses. - /// @return feedIndexes List of feed's indexes. - function feeds() - external - view - returns (address[] memory feeds, uint[] memory feedIndexes); + function feeds() external view returns (address[] memory feeds); /// @notice Lifts public key `pubKey` to being a feed. /// @dev Only callable by auth'ed address. - /// @dev The message expected to be signed by `ecdsaData` is defined as via - /// `feedRegistrationMessage()(bytes32)` function. + /// @dev The message expected to be signed by `ecdsaData` is defined via + /// `feedRegistrationMessage()(bytes32)`. /// @param pubKey The public key of the feed. /// @param ecdsaData ECDSA signed message by the feed's public key. - /// @return The feed index of the newly lifted feed. + /// @return feedId The id of the newly lifted feed. function lift(LibSecp256k1.Point memory pubKey, ECDSAData memory ecdsaData) external - returns (uint); + returns (uint8 feedId); /// @notice Lifts public keys `pubKeys` to being feeds. /// @dev Only callable by auth'ed address. - /// @dev The message expected to be signed by `ecdsaDatas` is defined as via - /// `feedRegistrationMessage()(bytes32)` function. + /// @dev The message expected to be signed by `ecdsaDatas` is defined via + /// `feedRegistrationMessage()(bytes32)`. /// @param pubKeys The public keys of the feeds. /// @param ecdsaDatas ECDSA signed message by the feeds' public keys. - /// @return List of feed indexes of the newly lifted feeds. + /// @return List of feed ids of the newly lifted feeds. function lift( LibSecp256k1.Point[] memory pubKeys, ECDSAData[] memory ecdsaDatas - ) external returns (uint[] memory); + ) external returns (uint8[] memory); - /// @notice Drops feed with index `feedIndex` from being a feed. + /// @notice Drops feed with id `feedId`. /// @dev Only callable by auth'ed address. - /// @param feedIndex The feed index identifier of the feed to drop. - function drop(uint feedIndex) external; + /// @param feedId The feed id to drop. + function drop(uint8 feedId) external; - /// @notice Drops feeds with indexes `feedIndexes` from being feeds. + /// @notice Drops feeds with ids' `feedIds`. /// @dev Only callable by auth'ed address. - /// @param feedIndexes The feed's index identifiers of the feeds to drop. - function drop(uint[] memory feedIndexes) external; + /// @param feedIds The feed ids to drop. + function drop(uint8[] memory feedIds) external; /// @notice Updates the bar security parameters to `bar`. /// @dev Only callable by auth'ed address. diff --git a/src/IScribeOptimistic.sol b/src/IScribeOptimistic.sol index 5bb86f9..9cc3ccb 100644 --- a/src/IScribeOptimistic.sol +++ b/src/IScribeOptimistic.sol @@ -8,8 +8,7 @@ interface IScribeOptimistic is IScribe { /// in challenge period. error InChallengePeriod(); - /// @notice Thrown if opChallenge called while no opPoke exists thats - /// challengeable. + /// @notice Thrown if opChallenge called while no challengeable opPoke exists. error NoOpPokeToChallenge(); /// @notice Thrown if opChallenge called with SchnorrData not matching @@ -19,6 +18,10 @@ interface IScribeOptimistic is IScribe { /// argument. error SchnorrDataMismatch(uint160 gotHash, uint160 wantHash); + /// @notice Thrown if opPoke called with non-feed ECDSA signature. + /// @param signer The ECDSA signature's signer. + error SignerNotFeed(address signer); + /// @notice Emitted when oracles was successfully opPoked. /// @param caller The caller's address. /// @param opFeed The feed that signed the opPoke. @@ -33,25 +36,34 @@ interface IScribeOptimistic is IScribe { /// @notice Emitted when successfully challenged an opPoke. /// @param caller The caller's address. + /// @param schnorrData The schnorrData challenged. /// @param schnorrErr The abi-encoded custom error returned from the failed /// Schnorr signature verification. event OpPokeChallengedSuccessfully( - address indexed caller, bytes schnorrErr + address indexed caller, + IScribe.SchnorrData schnorrData, + bytes schnorrErr ); /// @notice Emitted when unsuccessfully challenged an opPoke. /// @param caller The caller's address. - event OpPokeChallengedUnsuccessfully(address indexed caller); + /// @param schnorrData The schnorrData challenged. + event OpPokeChallengedUnsuccessfully( + address indexed caller, IScribe.SchnorrData schnorrData + ); /// @notice Emitted when ETH reward paid for successfully challenging an /// opPoke. /// @param challenger The challenger to which the reward was send. + /// @param schnorrData The schnorrData challenged. /// @param reward The ETH rewards paid. - event OpChallengeRewardPaid(address indexed challenger, uint reward); + event OpChallengeRewardPaid( + address indexed challenger, IScribe.SchnorrData schnorrData, uint reward + ); /// @notice Emitted when an opPoke dropped. /// @dev opPoke's are dropped if security parameters are updated that could - /// lead to an initially valid opPoke becoming invalid or an opPoke was + /// lead to an initially valid opPoke becoming invalid or if an opPoke /// was successfully challenged. /// @param caller The caller's address. /// @param pokeData The pokeData dropped. @@ -80,6 +92,7 @@ interface IScribeOptimistic is IScribe { /// @notice Optimistically pokes the oracle. /// @dev Expects `pokeData`'s age to be greater than the timestamp of the /// last successful poke. + /// @dev Expects `pokeData`'s age to not be greater than the current time. /// @dev Expects `ecdsaData` to be a signature from a feed. /// @dev Expects `ecdsaData` to prove the integrity of the `pokeData` and /// `schnorrData`. @@ -122,9 +135,9 @@ interface IScribeOptimistic is IScribe { SchnorrData calldata schnorrData ) external view returns (bytes32 opPokeMessage); - /// @notice Returns the feed index of the feed last opPoke'd. - /// @return opFeedIndex Feed index of the feed last opPoke'd. - function opFeedIndex() external view returns (uint8 opFeedIndex); + /// @notice Returns the feed id of the feed last opPoke'd. + /// @return opFeedId Feed id of the feed last opPoke'd. + function opFeedId() external view returns (uint8 opFeedId); /// @notice Returns the opChallengePeriod security parameter. /// @return opChallengePeriod The opChallengePeriod security parameter. diff --git a/src/Scribe.sol b/src/Scribe.sol index b657de2..45dd436 100644 --- a/src/Scribe.sol +++ b/src/Scribe.sol @@ -9,11 +9,10 @@ import {IScribe} from "./IScribe.sol"; import {LibSchnorr} from "./libs/LibSchnorr.sol"; import {LibSecp256k1} from "./libs/LibSecp256k1.sol"; -import {LibSchnorrData} from "./libs/LibSchnorrData.sol"; /** * @title Scribe - * @custom:version 1.2.0 + * @custom:version 2.0.0 * * @notice Efficient Schnorr multi-signature based Oracle */ @@ -21,10 +20,6 @@ contract Scribe is IScribe, Auth, Toll { using LibSchnorr for LibSecp256k1.Point; using LibSecp256k1 for LibSecp256k1.Point; using LibSecp256k1 for LibSecp256k1.JacobianPoint; - using LibSchnorrData for SchnorrData; - - /// @inheritdoc IScribe - uint public constant maxFeeds = type(uint8).max - 1; /// @inheritdoc IScribe uint8 public constant decimals = 18; @@ -40,20 +35,14 @@ contract Scribe is IScribe, Auth, Toll { /// @inheritdoc IChronicle bytes32 public immutable wat; - /// @dev The storage slot of _pubKeys[0]. - uint internal immutable SLOT_pubKeys; - // -- Storage -- /// @dev Scribe's current value and corresponding age. PokeData internal _pokeData; - /// @dev List of feeds' public keys. - LibSecp256k1.Point[] internal _pubKeys; - - /// @dev Mapping of feeds' addresses to their public key indexes in - /// _pubKeys. - mapping(address => uint) internal _feeds; + /// @dev Statically allocated array of feeds' public keys. + /// Indexed via the public keys address' highest-order byte. + LibSecp256k1.Point[256] internal _pubKeys; /// @inheritdoc IScribe /// @dev Note to have as last in storage to enable downstream contracts to @@ -62,7 +51,10 @@ contract Scribe is IScribe, Auth, Toll { // -- Constructor -- - constructor(address initialAuthed, bytes32 wat_) Auth(initialAuthed) { + constructor(address initialAuthed, bytes32 wat_) + payable + Auth(initialAuthed) + { require(wat_ != 0); // Set wat immutable. @@ -70,17 +62,6 @@ contract Scribe is IScribe, Auth, Toll { // Let initial bar be 2. _setBar(2); - - // Let _pubKeys[0] be the zero point. - _pubKeys.push(LibSecp256k1.ZERO_POINT()); - - // Let SLOT_pubKeys be _pubKeys[0].slot. - uint pubKeysSlot; - assembly ("memory-safe") { - mstore(0x00, _pubKeys.slot) - pubKeysSlot := keccak256(0x00, 0x20) - } - SLOT_pubKeys = pubKeysSlot; } // -- Poke Functionality -- @@ -162,70 +143,66 @@ contract Scribe is IScribe, Auth, Toll { } /// @custom:invariant Reverts iff out of gas. - /// @custom:invariant Runtime is Θ(bar). + /// @custom:invariant Runtime is O(bar). function _verifySchnorrSignature( bytes32 message, SchnorrData calldata schnorrData ) internal view returns (bool, bytes memory) { - // Let signerIndex be the current signer's index read from schnorrData. - uint signerIndex; - // Let signerPubKey be the public key stored for signerIndex. - LibSecp256k1.Point memory signerPubKey; - // Let signer be the address of signerPubKey. - address signer; - // Let lastSigner be the previous processed signer. - address lastSigner; - // Let aggPubKey be the sum of processed signers' public keys. + // Let feedPubKey be the currently processed feed's public key. + LibSecp256k1.Point memory feedPubKey; + // Let feedId be the currently processed feed's id. + uint8 feedId; + // Let aggPubKey be the sum of processed feeds' public keys. // Note that Jacobian coordinates are used. LibSecp256k1.JacobianPoint memory aggPubKey; + // Let bloom be a bloom filter to check for double signing attempts. + uint bloom; - // Fail if number signers unequal to bar. + // Fail if number feeds unequal to bar. // // Note that requiring equality constrains the verification's runtime // from Ω(bar) to Θ(bar). - uint numberSigners = schnorrData.getSignerIndexLength(); - if (numberSigners != bar) { - return (false, _errorBarNotReached(uint8(numberSigners), bar)); + uint numberFeeds = schnorrData.feedIds.length; + if (numberFeeds != bar) { + return (false, _errorBarNotReached(uint8(numberFeeds), bar)); } - // Initiate signer variables with schnorrData's 0's signer index. - signerIndex = schnorrData.getSignerIndex(0); - signerPubKey = _unsafeLoadPubKeyAt(signerIndex); - signer = signerPubKey.toAddress(); + // Initiate feed variables with schnorrData's 0's feed index. + feedId = uint8(schnorrData.feedIds[0]); + feedPubKey = _pubKeys[feedId]; - // Fail if signer not feed. - if (signerPubKey.isZeroPoint()) { - return (false, _errorSignerNotFeed(signer)); + // Fail if feed not lifted. + if (feedPubKey.isZeroPoint()) { + return (false, _errorInvalidFeedId(feedId)); } - // Initiate aggPubKey with value of first signerPubKey. - aggPubKey = signerPubKey.toJacobian(); + // Initiate bloom filter with feedId set. + bloom = 1 << feedId; - // Aggregate remaining encoded signers. - for (uint i = 1; i < bar;) { - // Update Signer Variables. - lastSigner = signer; - signerIndex = schnorrData.getSignerIndex(i); - signerPubKey = _unsafeLoadPubKeyAt(signerIndex); - signer = signerPubKey.toAddress(); + // Initiate aggPubKey with value of first feed's public key. + aggPubKey = feedPubKey.toJacobian(); - // Fail if signer not feed. - if (signerPubKey.isZeroPoint()) { - return (false, _errorSignerNotFeed(signer)); + for (uint8 i = 1; i < numberFeeds;) { + // Update feed variables. + feedId = uint8(schnorrData.feedIds[i]); + feedPubKey = _pubKeys[feedId]; + + // Fail if feed not lifted. + if (feedPubKey.isZeroPoint()) { + return (false, _errorInvalidFeedId(feedId)); } - // Fail if signers not strictly monotonically increasing. - // - // Note that this prevents double signing attacks and enforces - // strict ordering. - if (uint160(lastSigner) >= uint160(signer)) { - return (false, _errorSignersNotOrdered()); + // Fail if double signing attempted. + if (bloom & (1 << feedId) != 0) { + return (false, _errorDoubleSigningAttempted(feedId)); } + // Update bloom filter. + bloom |= 1 << feedId; - // assert(aggPubKey.x != signerPubKey.x); // Indicates rogue-key attack + // assert(aggPubKey.x != feedPubKey.x); // Indicates rogue-key attack - // Add signerPubKey to already aggregated public keys. - aggPubKey.addAffinePoint(signerPubKey); + // Add feedPubKey to already aggregated public keys. + aggPubKey.addAffinePoint(feedPubKey); // forgefmt: disable-next-item unchecked { ++i; } @@ -282,7 +259,7 @@ contract Scribe is IScribe, Auth, Toll { { uint val = _pokeData.val; uint age = _pokeData.age; - return (val != 0, val, age); + return val != 0 ? (true, val, age) : (false, 0, 0); } // - MakerDAO Compatibility @@ -336,66 +313,51 @@ contract Scribe is IScribe, Auth, Toll { // -- Public Read Functionality -- /// @inheritdoc IScribe - function feeds(address who) external view returns (bool, uint) { - uint index = _feeds[who]; - // assert(index != 0 ? !_pubKeys[index].isZeroPoint() : true); - return (index != 0, index); + function feeds(address who) external view returns (bool) { + uint8 feedId = uint8(uint(uint160(who)) >> 152); + + LibSecp256k1.Point memory pubKey = _pubKeys[feedId]; + + return !pubKey.isZeroPoint() && pubKey.toAddress() == who; } /// @inheritdoc IScribe - function feeds(uint index) external view returns (bool, address) { - if (index >= _pubKeys.length) { - return (false, address(0)); - } - - LibSecp256k1.Point memory pubKey = _pubKeys[index]; - if (pubKey.isZeroPoint()) { - return (false, address(0)); - } + function feeds(uint8 feedId) external view returns (bool, address) { + LibSecp256k1.Point memory pubKey = _pubKeys[feedId]; - return (true, pubKey.toAddress()); + return pubKey.isZeroPoint() + ? (false, address(0)) + : (true, pubKey.toAddress()); } /// @inheritdoc IScribe - function feeds() external view returns (address[] memory, uint[] memory) { - // Initiate arrays with upper limit length. - uint upperLimitLength = _pubKeys.length; - address[] memory feedsList = new address[](upperLimitLength); - uint[] memory feedsIndexesList = new uint[](upperLimitLength); - - // Iterate over feeds' public keys. If a public key is non-zero, their - // corresponding address is a feed. - uint ctr; + function feeds() external view returns (address[] memory) { + address[] memory feeds_ = new address[](256); + LibSecp256k1.Point memory pubKey; address feed; - uint feedIndex; - for (uint i; i < upperLimitLength;) { - pubKey = _pubKeys[i]; + uint ctr; + for (uint i; i < 256;) { + pubKey = _pubKeys[uint8(i)]; if (!pubKey.isZeroPoint()) { feed = pubKey.toAddress(); - // assert(feed != address(0)); - - feedIndex = _feeds[feed]; - // assert(feedIndex != 0); - feedsList[ctr] = feed; - feedsIndexesList[ctr] = feedIndex; + feeds_[ctr] = feed; - ctr++; + // forgefmt: disable-next-item + unchecked { ++ctr; } } // forgefmt: disable-next-item unchecked { ++i; } } - // Set length of arrays to number of feeds actually included. assembly ("memory-safe") { - mstore(feedsList, ctr) - mstore(feedsIndexesList, ctr) + mstore(feeds_, ctr) } - return (feedsList, feedsIndexesList); + return feeds_; } // -- Auth'ed Functionality -- @@ -404,7 +366,7 @@ contract Scribe is IScribe, Auth, Toll { function lift(LibSecp256k1.Point memory pubKey, ECDSAData memory ecdsaData) external auth - returns (uint) + returns (uint8) { return _lift(pubKey, ecdsaData); } @@ -413,24 +375,23 @@ contract Scribe is IScribe, Auth, Toll { function lift( LibSecp256k1.Point[] memory pubKeys, ECDSAData[] memory ecdsaDatas - ) external auth returns (uint[] memory) { + ) external auth returns (uint8[] memory) { require(pubKeys.length == ecdsaDatas.length); - uint[] memory indexes = new uint[](pubKeys.length); + uint8[] memory feedIds = new uint8[](pubKeys.length); for (uint i; i < pubKeys.length;) { - indexes[i] = _lift(pubKeys[i], ecdsaDatas[i]); + feedIds[i] = _lift(pubKeys[i], ecdsaDatas[i]); // forgefmt: disable-next-item unchecked { ++i; } } - // Note that indexes contains duplicates iff duplicate pubKeys provided. - return indexes; + return feedIds; } function _lift(LibSecp256k1.Point memory pubKey, ECDSAData memory ecdsaData) internal - returns (uint) + returns (uint8) { address feed = pubKey.toAddress(); // assert(feed != address(0)); @@ -444,44 +405,43 @@ contract Scribe is IScribe, Auth, Toll { ); require(feed == recovered); - uint index = _feeds[feed]; - if (index == 0) { - _pubKeys.push(pubKey); - index = _pubKeys.length - 1; - _feeds[feed] = index; + uint8 feedId = uint8(uint(uint160(feed)) >> 152); - emit FeedLifted(msg.sender, feed, index); + LibSecp256k1.Point memory sPubKey = _pubKeys[feedId]; + if (sPubKey.isZeroPoint()) { + _pubKeys[feedId] = pubKey; - require(index <= maxFeeds); + emit FeedLifted(msg.sender, feed); + } else { + // Note to be idempotent. However, disallow updating an id's feed + // via lifting without dropping the previous feed. + require(feed == sPubKey.toAddress()); } - return index; + return feedId; } /// @inheritdoc IScribe - function drop(uint feedIndex) external auth { - _drop(msg.sender, feedIndex); + function drop(uint8 feedId) external auth { + _drop(msg.sender, feedId); } /// @inheritdoc IScribe - function drop(uint[] memory feedIndexes) external auth { - for (uint i; i < feedIndexes.length;) { - _drop(msg.sender, feedIndexes[i]); + function drop(uint8[] memory feedIds) external auth { + for (uint i; i < feedIds.length;) { + _drop(msg.sender, feedIds[i]); // forgefmt: disable-next-item unchecked { ++i; } } } - function _drop(address caller, uint feedIndex) internal virtual { - require(feedIndex < _pubKeys.length); - address feed = _pubKeys[feedIndex].toAddress(); + function _drop(address caller, uint8 feedId) internal virtual { + LibSecp256k1.Point memory pubKey = _pubKeys[feedId]; + if (!pubKey.isZeroPoint()) { + delete _pubKeys[feedId]; - if (_feeds[feed] != 0) { - emit FeedDropped(caller, feed, _feeds[feed]); - - _feeds[feed] = 0; - _pubKeys[feedIndex] = LibSecp256k1.ZERO_POINT(); + emit FeedDropped(caller, pubKey.toAddress()); } } @@ -501,7 +461,6 @@ contract Scribe is IScribe, Auth, Toll { // -- Internal Helpers -- - /// @dev Halts execution by reverting with `err`. function _revert(bytes memory err) internal pure { // assert(err.length != 0); assembly ("memory-safe") { @@ -511,38 +470,6 @@ contract Scribe is IScribe, Auth, Toll { } } - /// @dev Returns the public key at `_pubKeys[index]`, or zero point if - /// `index` out of bounds. - function _unsafeLoadPubKeyAt(uint index) - internal - view - returns (LibSecp256k1.Point memory) - { - // Push immutable to stack as accessing through assembly not supported. - uint slotPubKeys = SLOT_pubKeys; - - LibSecp256k1.Point memory pubKey; - assembly ("memory-safe") { - // Note that a pubKey consists of two words. - let realIndex := mul(index, 2) - - // Compute slot of _pubKeys[index]. - let slot := add(slotPubKeys, realIndex) - - // Load _pubKeys[index]'s coordinates to stack. - let x := sload(slot) - let y := sload(add(slot, 1)) - - // Store coordinates in pubKey memory location. - mstore(pubKey, x) - mstore(add(pubKey, 0x20), y) - } - // assert(index < _pubKeys.length || pubKey.isZeroPoint()); - - // Note that pubKey is zero if index out of bounds. - return pubKey; - } - function _errorBarNotReached(uint8 got, uint8 want) internal pure @@ -552,17 +479,23 @@ contract Scribe is IScribe, Auth, Toll { return abi.encodeWithSelector(IScribe.BarNotReached.selector, got, want); } - function _errorSignerNotFeed(address signer) + function _errorInvalidFeedId(uint8 feedId) internal pure returns (bytes memory) { - // assert(_feeds[signer] == 0); - return abi.encodeWithSelector(IScribe.SignerNotFeed.selector, signer); + // assert(_pubKeys[feedId].isZeroPoint()); + return abi.encodeWithSelector(IScribe.InvalidFeedId.selector, feedId); } - function _errorSignersNotOrdered() internal pure returns (bytes memory) { - return abi.encodeWithSelector(IScribe.SignersNotOrdered.selector); + function _errorDoubleSigningAttempted(uint8 feedId) + internal + pure + returns (bytes memory) + { + return abi.encodeWithSelector( + IScribe.DoubleSigningAttempted.selector, feedId + ); } function _errorSchnorrSignatureInvalid() diff --git a/src/ScribeOptimistic.sol b/src/ScribeOptimistic.sol index 3f154c8..a512cee 100644 --- a/src/ScribeOptimistic.sol +++ b/src/ScribeOptimistic.sol @@ -21,16 +21,13 @@ contract ScribeOptimistic is IScribeOptimistic, Scribe { using LibSecp256k1 for LibSecp256k1.Point; using LibSecp256k1 for LibSecp256k1.Point[]; - /// @dev The initial opChallengePeriod set during construction. - uint16 private constant _INITIAL_OP_CHALLENGE_PERIOD = 1 hours; - // -- Storage -- /// @inheritdoc IScribeOptimistic uint16 public opChallengePeriod; /// @inheritdoc IScribeOptimistic - uint8 public opFeedIndex; + uint8 public opFeedId; /// @dev The truncated hash of the schnorrData provided in last opPoke. /// Binds the opFeed to their schnorrData. @@ -50,10 +47,14 @@ contract ScribeOptimistic is IScribeOptimistic, Scribe { // -- Constructor and Receive Functionality -- constructor(address initialAuthed, bytes32 wat_) + payable Scribe(initialAuthed, wat_) { // Note to have a non-zero challenge period. - _setOpChallengePeriod(_INITIAL_OP_CHALLENGE_PERIOD); + _setOpChallengePeriod(20 minutes); + + // Set maxChallengeReward to type(uint).max. + _setMaxChallengeRewards(type(uint).max); } receive() external payable {} @@ -98,8 +99,8 @@ contract ScribeOptimistic is IScribeOptimistic, Scribe { // -- opPoke Functionality -- /// @dev Optimized function selector: 0x00000000. - /// Note that this function is _not_ defined via the IScribe interface - /// and one should _not_ depend on it. + /// Note that this function is _not_ defined via the IScribeOptimistic + /// interface and one should _not_ depend on it. function opPoke_optimized_397084999( PokeData calldata pokeData, SchnorrData calldata schnorrData, @@ -122,6 +123,15 @@ contract ScribeOptimistic is IScribeOptimistic, Scribe { SchnorrData calldata schnorrData, ECDSAData calldata ecdsaData ) internal { + // Revert if schnorrData.feedIds' length is higher than bar's maximum + // value. + // + // Note that this prevents opPoke's with such big schnorrData that it + // becomes economically unprofitable to challenge them. + if (schnorrData.feedIds.length > type(uint8).max) { + revert BarNotReached(type(uint8).max, bar); + } + // Load _opPokeData from storage. PokeData memory opPokeData = _opPokeData; @@ -155,27 +165,25 @@ contract ScribeOptimistic is IScribeOptimistic, Scribe { ecdsaData.s ); - // Load signer's index. - uint signerIndex = _feeds[signer]; + // Compute feed id of signer. + uint8 feedId = uint8(uint(uint160(signer)) >> 152); // Revert if signer not feed. - if (signerIndex == 0) { + // assert(_pubKeys[feedId].toAddress() != address(0)); + if (_pubKeys[feedId].toAddress() != signer) { revert SignerNotFeed(signer); } - // Store the signerIndex as opFeedIndex and bind them to their provided + // Store the feed's id as opFeedId and bind them to their provided // schnorrData. - // - // Note that cast is safe as _feed's image is [0, _pubKeys.length) and - // _pubKeys' length is bounded by maxFeeds, i.e. type(uint8).max - 1. - opFeedIndex = uint8(signerIndex); + opFeedId = feedId; _schnorrDataCommitment = uint160( uint( keccak256( abi.encodePacked( schnorrData.signature, schnorrData.commitment, - schnorrData.signersBlob + schnorrData.feedIds ) ) ) @@ -222,7 +230,7 @@ contract ScribeOptimistic is IScribeOptimistic, Scribe { abi.encodePacked( schnorrData.signature, schnorrData.commitment, - schnorrData.signersBlob + schnorrData.feedIds ) ) ) @@ -255,20 +263,20 @@ contract ScribeOptimistic is IScribeOptimistic, Scribe { delete _opPokeData; } - emit OpPokeChallengedUnsuccessfully(msg.sender); + emit OpPokeChallengedUnsuccessfully(msg.sender, schnorrData); } else { // Drop opFeed and delete invalid _opPokeData. // Note to use address(this) as caller to indicate self-governed // drop of feed. - _drop(address(this), opFeedIndex); + _drop(address(this), opFeedId); // Pay ETH reward to challenger. uint reward = challengeReward(); if (_sendETH(payable(msg.sender), reward)) { - emit OpChallengeRewardPaid(msg.sender, reward); + emit OpChallengeRewardPaid(msg.sender, schnorrData, reward); } - emit OpPokeChallengedSuccessfully(msg.sender, err); + emit OpPokeChallengedSuccessfully(msg.sender, schnorrData, err); } // Return whether challenging was successful. @@ -297,7 +305,7 @@ contract ScribeOptimistic is IScribeOptimistic, Scribe { pokeData.age, schnorrData.signature, schnorrData.commitment, - schnorrData.signersBlob + schnorrData.feedIds ) ) ) @@ -349,6 +357,8 @@ contract ScribeOptimistic is IScribeOptimistic, Scribe { return (pokeData.val, pokeData.age); } + /// @inheritdoc IChronicle + /// @dev Only callable by toll'ed address. function tryReadWithAge() external view @@ -357,7 +367,9 @@ contract ScribeOptimistic is IScribeOptimistic, Scribe { returns (bool, uint, uint) { PokeData memory pokeData = _currentPokeData(); - return (pokeData.val != 0, pokeData.val, pokeData.age); + return pokeData.val != 0 + ? (true, pokeData.val, pokeData.age) + : (false, 0, 0); } // - MakerDAO Compatibility @@ -466,8 +478,8 @@ contract ScribeOptimistic is IScribeOptimistic, Scribe { _afterAuthedAction(); } - function _drop(address caller, uint feedIndex) internal override(Scribe) { - super._drop(caller, feedIndex); + function _drop(address caller, uint8 feedId) internal override(Scribe) { + super._drop(caller, feedId); _afterAuthedAction(); } @@ -552,6 +564,10 @@ contract ScribeOptimistic is IScribeOptimistic, Scribe { /// @inheritdoc IScribeOptimistic function setMaxChallengeReward(uint maxChallengeReward_) external auth { + _setMaxChallengeRewards(maxChallengeReward_); + } + + function _setMaxChallengeRewards(uint maxChallengeReward_) internal { if (maxChallengeReward != maxChallengeReward_) { emit MaxChallengeRewardUpdated( msg.sender, maxChallengeReward, maxChallengeReward_ diff --git a/src/libs/LibBytes.sol b/src/libs/LibBytes.sol deleted file mode 100644 index ebf09e0..0000000 --- a/src/libs/LibBytes.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; - -/** - * @title LibBytes - * - * @notice Library for common byte operations - */ -library LibBytes { - /// @dev Returns the `index`'s byte from `word`. - /// - /// It is the caller's responsibility to ensure `index < 32`! - /// - /// @custom:invariant Uses constant amount of gas. - function getByteAtIndex(uint word, uint index) - internal - pure - returns (uint) - { - uint result; - assembly ("memory-safe") { - result := byte(sub(31, index), word) - } - - // Note that the resulting byte is returned as word. - return result; - } -} diff --git a/src/libs/LibSchnorrData.sol b/src/libs/LibSchnorrData.sol deleted file mode 100644 index af83d31..0000000 --- a/src/libs/LibSchnorrData.sol +++ /dev/null @@ -1,102 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; - -import {IScribe} from "../IScribe.sol"; - -import {LibBytes} from "./LibBytes.sol"; - -/** - * @title LibSchnorrData - * - * @notice Library for working with IScribe.SchnorrData - */ -library LibSchnorrData { - using LibBytes for uint; - - /// @dev Size of a word is 32 bytes, i.e. 256 bits. - uint private constant WORD_SIZE = 32; - - /// @dev Returns the signer index from schnorrData.signersBlob with index - /// `index`. - /// - /// @dev Note that schnorrData.signersBlob is big-endian encoded and - /// counting starts at the highest order byte, i.e. the signer index 0 - /// is the highest order byte of schnorrData.signersBlob. - /// - /// @custom:example SignersBlob encoding via Solidity: - /// - /// ```solidity - /// bytes memory signersBlob; - /// uint8[] memory indexes = someFuncReturningUint8Array(); - /// for (uint i; i < indexes.length; i++) { - /// signersBlob = abi.encodePacked(signersBlob, indexes[i]); - /// } - /// ``` - /// - /// @dev Calldata layout for `schnorrData`: - /// - /// [schnorrData] signature -> schnorrData.signature - /// [schnorrData + 0x20] commitment -> schnorrData.commitment - /// [schnorrData + 0x40] offset(signersBlob) - /// [schnorrData + 0x60] len(signersBlob) -> schnorrData.signersBlob.length - /// [schnorrData + 0x80] signersBlob[0] -> schnorrData.signersBlob[0] - /// ... - /// - /// Note that the `schnorrData` variable holds the offset to the - /// `schnorrData` struct: - /// - /// ```solidity - /// bytes32 signature; - /// assembly { - /// signature := calldataload(schnorrData) - /// } - /// assert(signature == schnorrData.signature) - /// ``` - /// - /// Note that `offset(signersBlob)` is the offset to `signersBlob[0]` - /// from the index `offset(signersBlob)`. - /// - /// @custom:invariant Reverts iff out of gas. - function getSignerIndex( - IScribe.SchnorrData calldata schnorrData, - uint index - ) internal pure returns (uint) { - uint word; - assembly ("memory-safe") { - let wordIndex := mul(div(index, WORD_SIZE), WORD_SIZE) - - // Calldata index for schnorrData.signersBlob[0] is schnorrData's - // offset plus 4 words, i.e. 0x80. - let start := add(schnorrData, 0x80) - - // Note that reading non-existing calldata returns zero. - // Note that overflow is no concern because index's upper limit is - // bounded by bar, which is of type uint8. - word := calldataload(add(start, wordIndex)) - } - - // Unchecked because the subtrahend is guaranteed to be less than or - // equal to 31 due to being a (mod 32) result. - uint byteIndex; - unchecked { - byteIndex = 31 - (index % WORD_SIZE); - } - - return word.getByteAtIndex(byteIndex); - } - - /// @dev Returns the number of signers encoded in schnorrData.signersBlob. - function getSignerIndexLength(IScribe.SchnorrData calldata schnorrData) - internal - pure - returns (uint) - { - uint index; - assembly ("memory-safe") { - // Calldata index for schnorrData.signersBlob.length is - // schnorrData's offset plus 3 words, i.e. 0x60. - index := calldataload(add(schnorrData, 0x60)) - } - return index; - } -} diff --git a/test/EVMTest.sol b/test/EVMTest.sol index 9ba2d8a..8d9fe73 100644 --- a/test/EVMTest.sol +++ b/test/EVMTest.sol @@ -33,10 +33,10 @@ abstract contract EVMTest is Test { uint sSeed ) public { // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); // Let s ∊ [Q, type(uint).max]. - bytes32 s = bytes32(bound(sSeed, LibSecp256k1.Q(), type(uint).max)); + bytes32 s = bytes32(_bound(sSeed, LibSecp256k1.Q(), type(uint).max)); // Create ECDSA signature. (, bytes32 r,) = vm.sign(privKey, keccak256("scribe")); @@ -51,7 +51,7 @@ abstract contract EVMTest is Test { public { // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); // Create ECDSA signature. (,, bytes32 s) = vm.sign(privKey, keccak256("scribe")); diff --git a/test/IScribeOptimisticTest.sol b/test/IScribeOptimisticTest.sol index c2dc784..ef4a233 100644 --- a/test/IScribeOptimisticTest.sol +++ b/test/IScribeOptimisticTest.sol @@ -29,10 +29,16 @@ abstract contract IScribeOptimisticTest is IScribeTest { IScribe.PokeData pokeData ); event OpPokeChallengedSuccessfully( - address indexed caller, bytes schnorrErr + address indexed caller, + IScribe.SchnorrData schnorrData, + bytes schnorrErr + ); + event OpPokeChallengedUnsuccessfully( + address indexed caller, IScribe.SchnorrData schnorrData + ); + event OpChallengeRewardPaid( + address indexed challenger, IScribe.SchnorrData schnorrData, uint reward ); - event OpPokeChallengedUnsuccessfully(address indexed caller); - event OpChallengeRewardPaid(address indexed challenger, uint reward); event OpPokeDataDropped(address indexed caller, IScribe.PokeData pokeData); event OpChallengePeriodUpdated( address indexed caller, @@ -59,11 +65,14 @@ abstract contract IScribeOptimisticTest is IScribeTest { function test_Deployment() public override(IScribeTest) { super.test_Deployment(); - // opFeedIndex not set. - assertEq(opScribe.opFeedIndex(), 0); + // opFeedId set to zero. + assertEq(opScribe.opFeedId(), 0); - // OpChallengePeriod set to 1 hour. - assertEq(opScribe.opChallengePeriod(), 1 hours); + // OpChallengePeriod is non-zero. + assertNotEq(opScribe.opChallengePeriod(), 0); + + // MaxChallengeRewards set to type(uint).max. + assertEq(opScribe.maxChallengeReward(), type(uint).max); } // -- Test: Poke -- @@ -72,7 +81,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { uint val; uint age; - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); // Execute opPoke. IScribe.PokeData memory opPokeData; @@ -135,18 +144,18 @@ abstract contract IScribeOptimisticTest is IScribeTest { } } - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.SchnorrData memory schnorrData; IScribe.ECDSAData memory ecdsaData; uint feedIndex; for (uint i; i < pokeDatas.length; i++) { // Select random feed signing opPoke. - feedIndex = bound(feedIndexSeeds[i], 0, feeds.length - 1); + feedIndex = _bound(feedIndexSeeds[i], 0, feeds.length - 1); // Make sure val is non-zero and age not stale. pokeDatas[i].val = - uint128(bound(pokeDatas[i].val, 1, type(uint128).max)); + uint128(_bound(pokeDatas[i].val, 1, type(uint128).max)); // @todo Weird behaviour if compiled via --via-ir. // See comment in testFuzz_opPoke_FailsIf_AgeIsStale(). @@ -191,11 +200,11 @@ abstract contract IScribeOptimisticTest is IScribeTest { function testFuzz_opPoke_FailsIf_AgeIsStale( IScribe.PokeData memory pokeData ) public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); vm.assume(pokeData.val != 0); // Let pokeData's age ∊ [1, block.timestamp]. - pokeData.age = uint32(bound(pokeData.age, 1, block.timestamp)); + pokeData.age = uint32(_bound(pokeData.age, 1, block.timestamp)); IScribe.SchnorrData memory schnorrData; schnorrData = feeds.signSchnorr(opScribe.constructPokeMessage(pokeData)); @@ -208,12 +217,12 @@ abstract contract IScribeOptimisticTest is IScribeTest { // Execute opPoke. opScribe.opPoke(pokeData, schnorrData, ecdsaData); - // opPoke'd age is set to block.timestamp. + // opPoke's age is set to block.timestamp. uint lastAge = uint32(block.timestamp); console2.log("lastAge", lastAge); // Set pokeData's age ∊ [0, block.timestamp]. - pokeData.age = uint32(bound(pokeData.age, 0, block.timestamp)); + pokeData.age = uint32(_bound(pokeData.age, 0, block.timestamp)); // Wait until opPokeData finalized. vm.warp(block.timestamp + opScribe.opChallengePeriod()); @@ -242,12 +251,12 @@ abstract contract IScribeOptimisticTest is IScribeTest { function testFuzz_opPoke_FailsIf_AgeIsInTheFuture( IScribe.PokeData memory pokeData ) public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); vm.assume(pokeData.val != 0); // Let pokeData's age ∊ [block.timestamp+1, type(uint32).max]. pokeData.age = - uint32(bound(pokeData.age, block.timestamp + 1, type(uint32).max)); + uint32(_bound(pokeData.age, block.timestamp + 1, type(uint32).max)); IScribe.SchnorrData memory schnorrData; schnorrData = feeds.signSchnorr(opScribe.constructPokeMessage(pokeData)); @@ -273,7 +282,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { uint rMask, uint sMask ) public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.PokeData memory pokeData; pokeData.val = 1; @@ -302,7 +311,9 @@ abstract contract IScribeOptimisticTest is IScribeTest { ); vm.expectRevert( - abi.encodeWithSelector(IScribe.SignerNotFeed.selector, recovered) + abi.encodeWithSelector( + IScribeOptimistic.SignerNotFeed.selector, recovered + ) ); opScribe.opPoke(pokeData, schnorrData, ecdsaData); } @@ -310,7 +321,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { function testFuzz_opPoke_FailsIf_opPokeDataInChallengePeriodExists( uint warpSeed ) public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.PokeData memory pokeData; pokeData.val = 1; @@ -337,12 +348,42 @@ abstract contract IScribeOptimisticTest is IScribeTest { opScribe.opPoke(pokeData, schnorrData, ecdsaData); } + // See audits/Cantina@v2.0.0.pdf. + function testFuzz_opPoke_FailsIf_BarNotReached_DueTo_GasAttack( + uint feedIdsLengthSeed + ) public { + // Note to stay reasonable with calldata load. + uint feedIdsLength = + _bound(feedIdsLengthSeed, uint(type(uint8).max) + 1, 1_000); + + _liftFeeds(opScribe.bar()); + + IScribe.PokeData memory pokeData; + pokeData.val = 1; + pokeData.age = 1; + + IScribe.SchnorrData memory schnorrData; + for (uint i; i < feedIdsLength; i++) { + schnorrData.feedIds = + abi.encodePacked(schnorrData.feedIds, uint8(0xFF)); + } + + IScribe.ECDSAData memory ecdsaData; + + vm.expectRevert( + abi.encodeWithSelector( + IScribe.BarNotReached.selector, type(uint8).max, opScribe.bar() + ) + ); + opScribe.opPoke(pokeData, schnorrData, ecdsaData); + } + // -- Test: opChallenge -- function testFuzz_opChallenge_opPokeDataValidAndNotStale(uint warpSeed) public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.PokeData memory pokeData; pokeData.val = 1; @@ -368,7 +409,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { uint balanceBefore = address(this).balance; vm.expectEmit(); - emit OpPokeChallengedUnsuccessfully(address(this)); + emit OpPokeChallengedUnsuccessfully(address(this), schnorrData); // Challenge opPoke. bool opPokeInvalid = opScribe.opChallenge(schnorrData); @@ -394,7 +435,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { function testFuzz_opChallenge_opPokeDataValidButStale(uint warpSeed) public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.PokeData memory pokeData; pokeData.val = 1; @@ -427,7 +468,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { ); vm.expectEmit(); - emit OpPokeChallengedUnsuccessfully(address(this)); + emit OpPokeChallengedUnsuccessfully(address(this), schnorrData); // Challenge opPoke. bool opPokeInvalid = opScribe.opChallenge(schnorrData); @@ -451,7 +492,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { ) public { vm.assume(schnorrSignatureMask != 0 || schnorrCommitmentMask != 0); - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.PokeData memory pokeData; pokeData.val = 1; @@ -490,11 +531,12 @@ abstract contract IScribeOptimisticTest is IScribeTest { { // Expect events. vm.expectEmit(); - emit OpChallengeRewardPaid(address(this), 1 ether); + emit OpChallengeRewardPaid(address(this), schnorrData, 1 ether); vm.expectEmit(); emit OpPokeChallengedSuccessfully( address(this), + schnorrData, abi.encodeWithSelector(IScribe.SchnorrSignatureInvalid.selector) ); } @@ -506,7 +548,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { assertTrue(opPokeInvalid); // opFeed dropped. - (bool isFeed,) = opScribe.feeds(feeds[0].pubKey.toAddress()); + bool isFeed = opScribe.feeds(feeds[0].pubKey.toAddress()); assertFalse(isFeed); // 1 ETH reward paid. @@ -526,7 +568,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { } function test_opChallenge_FailsIf_InvalidSchnorrDataGiven() public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.PokeData memory pokeData; pokeData.val = 1; @@ -552,7 +594,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { } function test_opChallenge_FailsIf_CalledSubsequently() public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.PokeData memory pokeData; pokeData.val = 1; @@ -575,6 +617,64 @@ abstract contract IScribeOptimisticTest is IScribeTest { opScribe.opChallenge(schnorrData); } + // See audits/Cantina@v2.0.0.pdf. + function test_opChallenge_CalldataEncodingAttack() public { + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); + + IScribe.PokeData memory pokeData; + pokeData.val = 1; + pokeData.age = 1; + assertEq(opScribe.feeds().length, 2, "expected 2 feeds to start with"); + + IScribe.SchnorrData memory schnorrData; + schnorrData = feeds.signSchnorr(opScribe.constructPokeMessage(pokeData)); + + IScribe.ECDSAData memory ecdsaData; + ecdsaData = feeds[0].signECDSA( + opScribe.constructOpPokeMessage(pokeData, schnorrData) + ); + + // Execute valid opPoke. + opScribe.opPoke(pokeData, schnorrData, ecdsaData); + + // Challenge opPoke. + // bytes memory defaultCalldata = abi.encodeCall(opScribe.opChallenge, schnorrData); + // console2.logBytes(defaultCalldata); + // 8928a1f8 // selector + // 0000000000000000000000000000000000000000000000000000000000000020 // struct offset + // fecd661c0731ca99672edb7303a072da3c2b8342e714c2f2a90639b966298958 // signature + // 000000000000000000000000026428bf84a659a2d371be1e705613d89d93f78f // commitment + // 0000000000000000000000000000000000000000000000000000000000000060 // offset(feedIds) + // 0000000000000000000000000000000000000000000000000000000000000002 // length(feedIds) + // 2b68000000000000000000000000000000000000000000000000000000000000 // feedIds + bytes memory customCalldata = ( + hex"8928a1f8" // selector + hex"0000000000000000000000000000000000000000000000000000000000000020" // struct offset + hex"fecd661c0731ca99672edb7303a072da3c2b8342e714c2f2a90639b966298958" // signature + hex"000000000000000000000000026428bf84a659a2d371be1e705613d89d93f78f" // commitment + hex"00000000000000000000000000000000000000000000000000000000000000a0" // offset(feedIds) + hex"0000000000000000000000000000000000000000000000000000000000000002" // injected(feedIds).length + hex"2b2b000000000000000000000000000000000000000000000000000000000000" // injected(feedIds) (double sign) + hex"0000000000000000000000000000000000000000000000000000000000000002" // length(feedIds) + hex"2b68000000000000000000000000000000000000000000000000000000000000" + ); // feedIds + + (bool success, bytes memory retData) = + address(opScribe).call(customCalldata); + if (!success || retData.length != 32) revert(); + bool opPokeInvalid = abi.decode(retData, (bool)); + + // Original PoC: + // assertTrue(opPokeInvalid, "expected opChallenge to return true"); + // assertEq(opScribe.feeds().length, 1, "expected feed to be dropped"); + + // Fixed: + assertFalse(opPokeInvalid, "opChallenge: Calldata encoding attack"); + assertEq( + opScribe.feeds().length, 2, "opChallenge: Calldata encoding attack" + ); + } + // -- Test: Public View Functions -- function testFuzz_challengeReward(uint maxChallengeReward, uint balance) @@ -639,7 +739,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { function test_setOpChallengePeriod_DropsFinalizedOpPoke_If_NonFinalizedAfterUpdate( ) public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); // Execute opPoke. IScribe.PokeData memory opPokeData; @@ -689,8 +789,9 @@ abstract contract IScribeOptimisticTest is IScribeTest { function _setUpFeedsAndOpPokeOnce(IScribe.PokeData memory pokeData) private + returns (LibFeed.Feed[] memory) { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.SchnorrData memory schnorrData; schnorrData = feeds.signSchnorr(opScribe.constructPokeMessage(pokeData)); @@ -702,6 +803,8 @@ abstract contract IScribeOptimisticTest is IScribeTest { opScribe.constructOpPokeMessage(pokeData, schnorrData) ) ); + + return feeds; } function testFuzz_setOpChallengePeriod_IsAfterAuthedActionProtected( @@ -730,7 +833,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { pokeData.val = 1; pokeData.age = uint32(block.timestamp); - _setUpFeedsAndOpPokeOnce(pokeData); + LibFeed.Feed[] memory feeds = _setUpFeedsAndOpPokeOnce(pokeData); if (opPokeFinalized) { vm.warp(block.timestamp + opScribe.opChallengePeriod()); @@ -739,7 +842,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { emit OpPokeDataDropped(address(this), pokeData); } - opScribe.drop(1); + opScribe.drop(feeds[0].id); } function testFuzz_drop_Multiple_IsAfterAuthedActionProtected( @@ -749,7 +852,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { pokeData.val = 1; pokeData.age = uint32(block.timestamp); - _setUpFeedsAndOpPokeOnce(pokeData); + LibFeed.Feed[] memory feeds = _setUpFeedsAndOpPokeOnce(pokeData); if (opPokeFinalized) { vm.warp(block.timestamp + opScribe.opChallengePeriod()); @@ -758,10 +861,12 @@ abstract contract IScribeOptimisticTest is IScribeTest { emit OpPokeDataDropped(address(this), pokeData); } - uint[] memory feedIndexes = new uint[](1); - feedIndexes[0] = 1; + uint8[] memory feedIds = new uint8[](feeds.length); + for (uint i; i < feeds.length; i++) { + feedIds[i] = feeds[i].id; + } - opScribe.drop(feedIndexes); + opScribe.drop(feedIds); } function testFuzz_setBar_IsAfterAuthedActionProtected(bool opPokeFinalized) @@ -799,9 +904,9 @@ abstract contract IScribeOptimisticTest is IScribeTest { function testFuzz_afterAuthedAction_ProvidesValue_If_MoreThanOncePoked( uint pathSeed ) public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); - uint path = bound(pathSeed, 0, 6); + uint path = _bound(pathSeed, 0, 6); uint128 otherVal = 1; uint128 wantVal = 2; @@ -1046,9 +1151,13 @@ abstract contract IScribeOptimisticTest is IScribeTest { function _setUp_afterAuthedAction_1() internal - returns (IScribe.PokeData memory, IScribe.PokeData memory) + returns ( + IScribe.PokeData memory, + IScribe.PokeData memory, + LibFeed.Feed[] memory + ) { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.PokeData memory pokeData; IScribe.PokeData memory opPokeData = IScribe.PokeData(1, 1); @@ -1063,7 +1172,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { ) ); - return (pokeData, opPokeData); + return (pokeData, opPokeData, feeds); } function test_afterAuthedAction_1_setBar() public { @@ -1079,9 +1188,9 @@ abstract contract IScribeOptimisticTest is IScribeTest { } function test_afterAuthedAction_1_drop() public { - _setUp_afterAuthedAction_1(); + (,, LibFeed.Feed[] memory feeds) = _setUp_afterAuthedAction_1(); - opScribe.drop(1); + opScribe.drop(feeds[0].id); (bool ok,) = opScribe.tryRead(); assertFalse(ok); @@ -1116,9 +1225,13 @@ abstract contract IScribeOptimisticTest is IScribeTest { function _setUp_afterAuthedAction_2() internal - returns (IScribe.PokeData memory, IScribe.PokeData memory) + returns ( + IScribe.PokeData memory, + IScribe.PokeData memory, + LibFeed.Feed[] memory + ) { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.PokeData memory pokeData = IScribe.PokeData(2, 1); opScribe.poke( @@ -1140,11 +1253,11 @@ abstract contract IScribeOptimisticTest is IScribeTest { ) ); - return (pokeData, opPokeData); + return (pokeData, opPokeData, feeds); } function test_afterAuthedAction_2_setBar() public { - (IScribe.PokeData memory pokeData,) = _setUp_afterAuthedAction_2(); + (IScribe.PokeData memory pokeData,,) = _setUp_afterAuthedAction_2(); opScribe.setBar(3); @@ -1158,9 +1271,10 @@ abstract contract IScribeOptimisticTest is IScribeTest { } function test_afterAuthedAction_2_drop() public { - (IScribe.PokeData memory pokeData,) = _setUp_afterAuthedAction_2(); + (IScribe.PokeData memory pokeData,, LibFeed.Feed[] memory feeds) = + _setUp_afterAuthedAction_2(); - opScribe.drop(1); + opScribe.drop(feeds[0].id); (bool ok, uint val, uint age) = opScribe.tryReadWithAge(); assertTrue(ok); @@ -1172,7 +1286,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { } function test_afterAuthedAction_2_setChallengePeriod() public { - (IScribe.PokeData memory pokeData,) = _setUp_afterAuthedAction_2(); + (IScribe.PokeData memory pokeData,,) = _setUp_afterAuthedAction_2(); // Note that _opPokeData still non-finalized after challenge period // update. @@ -1199,9 +1313,13 @@ abstract contract IScribeOptimisticTest is IScribeTest { function _setUp_afterAuthedAction_3() internal - returns (IScribe.PokeData memory, IScribe.PokeData memory) + returns ( + IScribe.PokeData memory, + IScribe.PokeData memory, + LibFeed.Feed[] memory + ) { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.PokeData memory opPokeData = IScribe.PokeData(1, uint32(block.timestamp)); @@ -1218,11 +1336,11 @@ abstract contract IScribeOptimisticTest is IScribeTest { vm.warp(block.timestamp + opScribe.opChallengePeriod() + 1); - return (IScribe.PokeData(0, 0), opPokeData); + return (IScribe.PokeData(0, 0), opPokeData, feeds); } function test_afterAuthedAction_3_setBar() public { - (, IScribe.PokeData memory opPokeData) = _setUp_afterAuthedAction_3(); + (, IScribe.PokeData memory opPokeData,) = _setUp_afterAuthedAction_3(); opScribe.setBar(3); @@ -1236,9 +1354,10 @@ abstract contract IScribeOptimisticTest is IScribeTest { } function test_afterAuthedAction_3_drop() public { - (, IScribe.PokeData memory opPokeData) = _setUp_afterAuthedAction_3(); + (, IScribe.PokeData memory opPokeData, LibFeed.Feed[] memory feeds) = + _setUp_afterAuthedAction_3(); - opScribe.drop(1); + opScribe.drop(feeds[0].id); (bool ok, uint val, uint age) = opScribe.tryReadWithAge(); assertTrue(ok); @@ -1250,7 +1369,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { } function test_afterAuthedAction_3_setChallengePeriod() public { - (, IScribe.PokeData memory opPokeData) = _setUp_afterAuthedAction_3(); + (, IScribe.PokeData memory opPokeData,) = _setUp_afterAuthedAction_3(); // Update challenge period so that _opPokeData still finalized. opScribe.setOpChallengePeriod(1); @@ -1276,9 +1395,13 @@ abstract contract IScribeOptimisticTest is IScribeTest { function _setUp_afterAuthedAction_4() internal - returns (IScribe.PokeData memory, IScribe.PokeData memory) + returns ( + IScribe.PokeData memory, + IScribe.PokeData memory, + LibFeed.Feed[] memory + ) { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(opScribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(opScribe.bar()); IScribe.PokeData memory pokeData = IScribe.PokeData(2, 1); opScribe.poke( @@ -1302,11 +1425,11 @@ abstract contract IScribeOptimisticTest is IScribeTest { vm.warp(block.timestamp + opScribe.opChallengePeriod() + 1); - return (pokeData, opPokeData); + return (pokeData, opPokeData, feeds); } function test_afterAuthedAction_4_setBar() public { - (, IScribe.PokeData memory opPokeData) = _setUp_afterAuthedAction_4(); + (, IScribe.PokeData memory opPokeData,) = _setUp_afterAuthedAction_4(); opScribe.setBar(3); @@ -1319,9 +1442,10 @@ abstract contract IScribeOptimisticTest is IScribeTest { } function test_afterAuthedAction_4_drop() public { - (, IScribe.PokeData memory opPokeData) = _setUp_afterAuthedAction_4(); + (, IScribe.PokeData memory opPokeData, LibFeed.Feed[] memory feeds) = + _setUp_afterAuthedAction_4(); - opScribe.drop(1); + opScribe.drop(feeds[0].id); (bool ok, uint val,) = opScribe.tryReadWithAge(); assertTrue(ok); @@ -1332,7 +1456,7 @@ abstract contract IScribeOptimisticTest is IScribeTest { } function test_afterAuthedAction_4_setChallengePeriod() public { - (, IScribe.PokeData memory opPokeData) = _setUp_afterAuthedAction_4(); + (, IScribe.PokeData memory opPokeData,) = _setUp_afterAuthedAction_4(); // Update challenge period so that _opPokeData still finalized. opScribe.setOpChallengePeriod(1); diff --git a/test/IScribeTest.sol b/test/IScribeTest.sol index 90ec0bf..60e4768 100644 --- a/test/IScribeTest.sol +++ b/test/IScribeTest.sol @@ -23,18 +23,10 @@ abstract contract IScribeTest is Test { bytes32 internal WAT; bytes32 internal FEED_REGISTRATION_MESSAGE; - LibFeed.Feed internal notFeed; - - mapping(address => bool) internal addressFilter; - // Events copied from IScribe. event Poked(address indexed caller, uint128 val, uint32 age); - event FeedLifted( - address indexed caller, address indexed feed, uint indexed index - ); - event FeedDropped( - address indexed caller, address indexed feed, uint indexed index - ); + event FeedLifted(address indexed caller, address indexed feed); + event FeedDropped(address indexed caller, address indexed feed); event BarUpdated(address indexed caller, uint8 oldBar, uint8 newBar); function setUp(address scribe_) internal virtual { @@ -46,37 +38,38 @@ abstract contract IScribeTest is Test { // Toll address(this). IToll(address(scribe)).kiss(address(this)); - - // Create a non-lifted feed instance. - notFeed = LibFeed.newFeed({privKey: 0xdead, index: type(uint8).max}); } - function _createAndLiftFeeds(uint numberFeeds) + function _liftFeeds(uint8 numberFeeds) internal returns (LibFeed.Feed[] memory) { + LibFeed.Feed[] memory feeds = new LibFeed.Feed[](uint(numberFeeds)); + // Note to not start with privKey=1. This is because the sum of public // keys would evaluate to: // pubKeyOf(1) + pubKeyOf(2) + pubKeyOf(3) + ... // = pubKeyOf(3) + pubKeyOf(3) + ... // Note that pubKeyOf(3) would be doubled. Doubling is not supported by // LibSecp256k1 as this would indicate a double-signing attack. - uint startPrivKey = 2; - - LibFeed.Feed[] memory feeds = new LibFeed.Feed[](numberFeeds); - for (uint i; i < numberFeeds; i++) { - feeds[i] = LibFeed.newFeed({ - privKey: startPrivKey + i, - index: uint8(i + 1) - }); - vm.label( - feeds[i].pubKey.toAddress(), - string.concat("Feed #", vm.toString(i + 1)) - ); + uint privKey = 2; + uint bloom; + uint ctr; + while (ctr != numberFeeds) { + LibFeed.Feed memory feed = LibFeed.newFeed({privKey: privKey}); + + // Check whether feed with id already created, if not create and + // lift. + if (bloom & (1 << feed.id) == 0) { + bloom |= 1 << feed.id; + + feeds[ctr++] = feed; + scribe.lift( + feed.pubKey, feed.signECDSA(FEED_REGISTRATION_MESSAGE) + ); + } - scribe.lift( - feeds[i].pubKey, feeds[i].signECDSA(FEED_REGISTRATION_MESSAGE) - ); + privKey++; } return feeds; @@ -140,9 +133,8 @@ abstract contract IScribeTest is Test { assertEq(scribe.bar(), 2); // Set of feeds is empty. - (address[] memory feeds_, uint[] memory feedsIndexes) = scribe.feeds(); - assertEq(feeds_.length, 0); - assertEq(feedsIndexes.length, 0); + address[] memory feeds = scribe.feeds(); + assertEq(feeds.length, 0); // read()(uint) fails. try scribe.read() returns (uint) { @@ -196,17 +188,17 @@ abstract contract IScribeTest is Test { assertEq(answeredInRound, 1); // latestAnswer()(int) returns zero. + // Note that latestAnswer()(int) is deprecated. assertEq(scribe.latestAnswer(), int(0)); } // -- Test: Schnorr Verification -- function testFuzz_isAcceptableSchnorrSignatureNow(uint barSeed) public { - // Let bar ∊ [1, scribe.maxFeeds()]. - uint bar = bound(barSeed, 1, scribe.maxFeeds()); - - scribe.setBar(uint8(bar)); - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(bar); + // Let bar ∊ [1, 256). + uint8 bar = uint8(_bound(barSeed, 1, 256 - 1)); + scribe.setBar(bar); + LibFeed.Feed[] memory feeds = _liftFeeds(bar); bytes32 message = keccak256("scribe"); @@ -218,20 +210,19 @@ abstract contract IScribeTest is Test { function testFuzz_isAcceptableSchnorrSignatureNow_FailsIf_BarNotReached( uint barSeed, - uint numberSignersSeed + uint numberFeedsSeed ) public { - // Let bar ∊ [2, scribe.maxFeeds()]. - uint bar = bound(barSeed, 2, scribe.maxFeeds()); - - // Let numberSigners ∊ [1, bar). - uint numberSigners = bound(numberSignersSeed, 1, bar - 1); + // Let bar ∊ [2, 256). + uint8 bar = uint8(_bound(barSeed, 2, 256 - 1)); + scribe.setBar(bar); + LibFeed.Feed[] memory feeds = _liftFeeds(bar); - scribe.setBar(uint8(bar)); - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(bar); + // Let numberFeeds ∊ [1, bar). + uint numberFeeds = _bound(numberFeedsSeed, 1, uint(bar) - 1); assembly ("memory-safe") { - // Set length of feeds list to numberSigners. - mstore(feeds, numberSigners) + // Set length of feeds list to numberFeeds. + mstore(feeds, numberFeeds) } bytes32 message = keccak256("scribe"); @@ -242,37 +233,54 @@ abstract contract IScribeTest is Test { assertFalse(ok); } - function testFuzz_isAcceptableSchnorrSignatureNow_FailsIf_SignersNotOrdered( - uint barSeed + function testFuzz_isAcceptableSchnorrSignatureNow_FailsIf_DoubleSigningAttempted( + uint barSeed, + uint doubleSignerIndexSeed ) public { - // Let bar ∊ [3, scribe.maxFeeds()]. - uint bar = bound(barSeed, 3, scribe.maxFeeds()); + // Let bar ∊ [2, 256). + uint8 bar = uint8(_bound(barSeed, 2, 256 - 1)); + scribe.setBar(bar); + LibFeed.Feed[] memory feeds = _liftFeeds(bar); - scribe.setBar(uint8(bar)); - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(bar); + // Let doubleSignerIndex ∊ [1, bar). + uint doubleSignerIndex = _bound(doubleSignerIndexSeed, 1, uint(bar) - 1); + + // Let random feed double sign. + feeds[0] = feeds[doubleSignerIndex]; bytes32 message = keccak256("scribe"); bool ok = scribe.isAcceptableSchnorrSignatureNow( - message, feeds.signSchnorr_withoutOrderingSignerIndexes(message) + message, feeds.signSchnorr(message) ); assertFalse(ok); } - function testFuzz_isAcceptableSchnorrSignatureNow_FailsIf_SignerNotFeed( + function testFuzz_isAcceptableSchnorrSignatureNow_FailsIf_InvalidFeedId( uint barSeed, - uint nonSignerIndexSeed + uint privKeySeed, + uint indexSeed ) public { - // Let bar ∊ [1, scribe.maxFeeds()]. - uint bar = bound(barSeed, 1, scribe.maxFeeds()); + // Let bar ∊ [2, 256). + uint8 bar = uint8(_bound(barSeed, 2, 256 - 1)); + scribe.setBar(bar); + LibFeed.Feed[] memory feeds = _liftFeeds(bar); + + // Let privKey ∊ [1, Q). + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); - // Let nonSignerIndex ∊ [0, bar). - uint nonSignerIndex = bound(nonSignerIndexSeed, 0, bar - 1); + // Note to not lift feed. + LibFeed.Feed memory feed = LibFeed.newFeed({privKey: privKey}); - scribe.setBar(uint8(bar)); - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(bar); + // Don't run test if bad luck and feed already lifted. + (bool isFeed, /*feedAddr*/ ) = scribe.feeds(feed.id); + if (isFeed) return; - feeds[nonSignerIndex] = notFeed; + // Let index ∊ [0, bar). + uint index = _bound(indexSeed, 0, bar - 1); + + // Let non-lifted feed be the index's signer. + feeds[index] = feed; bytes32 message = keccak256("scribe"); @@ -285,11 +293,10 @@ abstract contract IScribeTest is Test { function testFuzz_isAcceptableSchnorrSignatureNow_FailsIf_SignatureInvalid( uint barSeed ) public { - // Let bar ∊ [1, scribe.maxFeeds()]. - uint bar = bound(barSeed, 1, scribe.maxFeeds()); - - scribe.setBar(uint8(bar)); - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(bar); + // Let bar ∊ [1, 256). + uint8 bar = uint8(_bound(barSeed, 1, 256 - 1)); + scribe.setBar(bar); + LibFeed.Feed[] memory feeds = _liftFeeds(bar); bytes32 message = keccak256("scribe"); @@ -308,17 +315,18 @@ abstract contract IScribeTest is Test { // -- Test: Poke -- function testFuzz_poke(IScribe.PokeData[] memory pokeDatas) public { - vm.assume(pokeDatas.length < 50); + LibFeed.Feed[] memory feeds = _liftFeeds(scribe.bar()); - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(scribe.bar()); + // Note to stay reasonable in favor of runtime. + vm.assume(pokeDatas.length < 50); uint32 lastPokeTimestamp = 0; IScribe.SchnorrData memory schnorrData; for (uint i; i < pokeDatas.length; i++) { pokeDatas[i].val = - uint128(bound(pokeDatas[i].val, 1, type(uint128).max)); + uint128(_bound(pokeDatas[i].val, 1, type(uint128).max)); pokeDatas[i].age = uint32( - bound(pokeDatas[i].age, lastPokeTimestamp + 1, block.timestamp) + _bound(pokeDatas[i].age, lastPokeTimestamp + 1, block.timestamp) ); schnorrData = @@ -337,7 +345,7 @@ abstract contract IScribeTest is Test { } function test_poke_Initial_FailsIf_AgeIsZero() public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(scribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(scribe.bar()); IScribe.PokeData memory pokeData; pokeData.val = 1; @@ -355,11 +363,11 @@ abstract contract IScribeTest is Test { function testFuzz_poke_FailsIf_AgeIsStale(IScribe.PokeData memory pokeData) public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(scribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(scribe.bar()); vm.assume(pokeData.val != 0); // Let pokeData's age ∊ [1, block.timestamp]. - pokeData.age = uint32(bound(pokeData.age, 1, block.timestamp)); + pokeData.age = uint32(_bound(pokeData.age, 1, block.timestamp)); IScribe.SchnorrData memory schnorrData; schnorrData = feeds.signSchnorr(scribe.constructPokeMessage(pokeData)); @@ -371,7 +379,7 @@ abstract contract IScribeTest is Test { uint currentAge = uint32(block.timestamp); // Set pokeData's age ∊ [0, block.timestamp]. - pokeData.age = uint32(bound(pokeData.age, 0, block.timestamp)); + pokeData.age = uint32(_bound(pokeData.age, 0, block.timestamp)); schnorrData = feeds.signSchnorr(scribe.constructPokeMessage(pokeData)); @@ -387,10 +395,10 @@ abstract contract IScribeTest is Test { function testFuzz_poke_FailsIf_AgeIsInTheFuture( IScribe.PokeData memory pokeData ) public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(scribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(scribe.bar()); vm.assume(pokeData.val != 0); - // Let pokeData's age ∊ [block.timestamp+1, type(uint32).max]. + // Let pokeData's age ∊ [block.timestamp + 1, type(uint32).max]. pokeData.age = uint32(bound(pokeData.age, block.timestamp + 1, type(uint32).max)); @@ -410,10 +418,12 @@ abstract contract IScribeTest is Test { function testFuzz_poke_FailsIf_SignatureInvalid( IScribe.PokeData memory pokeData ) public { - LibFeed.Feed[] memory feeds = _createAndLiftFeeds(scribe.bar()); + LibFeed.Feed[] memory feeds = _liftFeeds(scribe.bar()); - vm.assume(pokeData.val != 0); - vm.assume(pokeData.age != 0 && pokeData.age <= uint32(block.timestamp)); + // Let pokeData's val ∊ [1, type(uint128).max]. + // Let pokeData's age ∊ [1, block.timestamp]. + pokeData.val = uint128(_bound(pokeData.val, 1, type(uint128).max)); + pokeData.age = uint32(_bound(pokeData.age, 1, block.timestamp)); // Create schnorrData signing different message. bytes32 message = keccak256("scribe"); @@ -438,150 +448,146 @@ abstract contract IScribeTest is Test { // -- Test: Auth Protected Functions -- function testFuzz_lift_Single(uint privKey) public { - // Bound private key to secp256k1's order, i.e. scalar ∊ [1, Q). - privKey = bound(privKey, 1, LibSecp256k1.Q() - 1); + // Let privKey ∊ [1, Q). + privKey = _bound(privKey, 1, LibSecp256k1.Q() - 1); LibFeed.Feed memory feed = LibFeed.newFeed(privKey); vm.expectEmit(); - emit FeedLifted(address(this), feed.pubKey.toAddress(), 1); + emit FeedLifted(address(this), feed.pubKey.toAddress()); - uint index = + uint feedId = scribe.lift(feed.pubKey, feed.signECDSA(FEED_REGISTRATION_MESSAGE)); - assertEq(index, 1); + assertEq(feedId, feed.id); - // Check via feeds(address)(bool,uint). - bool ok; - (ok, index) = scribe.feeds(feed.pubKey.toAddress()); - assertTrue(ok); - assertEq(index, 1); + // Is idempotent. + scribe.lift(feed.pubKey, feed.signECDSA(FEED_REGISTRATION_MESSAGE)); - // Check via feeds(uint)(bool,address). + // Check via feeds(address)(bool). + bool isFeed = scribe.feeds(feed.pubKey.toAddress()); + assertTrue(isFeed); + + // Check via feeds(uint8)(bool,address). address feedAddr; - (ok, feedAddr) = scribe.feeds(1); - assertTrue(ok); + (isFeed, feedAddr) = scribe.feeds(feed.id); + assertTrue(isFeed); assertEq(feedAddr, feed.pubKey.toAddress()); - // Check via feeds()(address[],uint[]). - address[] memory feeds_; - uint[] memory indexes; - (feeds_, indexes) = scribe.feeds(); - assertEq(feeds_.length, indexes.length); + // Check via feeds()(address[]). + address[] memory feeds_ = scribe.feeds(); assertEq(feeds_.length, 1); assertEq(feeds_[0], feed.pubKey.toAddress()); - assertEq(indexes[0], 1); } function test_lift_Single_FailsIf_ECDSADataInvalid() public { - uint privKeySigner = 1; - uint privKeyFeed = 2; - vm.expectRevert(); scribe.lift( - LibFeed.newFeed(privKeyFeed).pubKey, - LibFeed.newFeed(privKeySigner).signECDSA(FEED_REGISTRATION_MESSAGE) + LibFeed.newFeed({privKey: 1}).pubKey, + LibFeed.newFeed({privKey: 2}).signECDSA(FEED_REGISTRATION_MESSAGE) ); } - function test_lift_Single_FailsIf_MaxFeedsReached() public { - uint maxFeeds = scribe.maxFeeds(); + function test_lift_Single_FailsIf_FeedIdAlreadyLifted() public { + LibFeed.Feed memory feed1 = LibFeed.newFeed({privKey: 22171}); + LibFeed.Feed memory feed2 = LibFeed.newFeed({privKey: 38091}); - // Lift maxFeeds feeds. - LibFeed.Feed memory feed; - for (uint i; i < maxFeeds; i++) { - feed = LibFeed.newFeed(i + 1); - scribe.lift(feed.pubKey, feed.signECDSA(FEED_REGISTRATION_MESSAGE)); - } + // Both feeds have same id. + assertTrue(feed1.id == feed2.id); + + scribe.lift(feed1.pubKey, feed1.signECDSA(FEED_REGISTRATION_MESSAGE)); - feed = LibFeed.newFeed(maxFeeds + 1); vm.expectRevert(); - scribe.lift(feed.pubKey, feed.signECDSA(FEED_REGISTRATION_MESSAGE)); + scribe.lift(feed2.pubKey, feed2.signECDSA(FEED_REGISTRATION_MESSAGE)); } function testFuzz_lift_Multiple(uint[] memory privKeys) public { - // Bound private keys to secp256k1's order, i.e. scalar ∊ [1, Q). + vm.assume(privKeys.length < 50); + + // Let each privKey ∊ [1, Q). for (uint i; i < privKeys.length; i++) { - privKeys[i] = bound(privKeys[i], 1, LibSecp256k1.Q() - 1); + privKeys[i] = _bound(privKeys[i], 1, LibSecp256k1.Q() - 1); } - // Make feeds. - LibFeed.Feed[] memory feeds_ = new LibFeed.Feed[](privKeys.length); + // Make at most one feed per id. + LibFeed.Feed[] memory feeds = new LibFeed.Feed[](privKeys.length); + uint bloom; + uint ctr; for (uint i; i < privKeys.length; i++) { - feeds_[i] = LibFeed.newFeed(privKeys[i]); + LibFeed.Feed memory feed = LibFeed.newFeed(privKeys[i]); + + if (bloom & (1 << feed.id) == 0) { + bloom |= 1 << feed.id; + + feeds[ctr++] = feed; + } + } + assembly ("memory-safe") { + mstore(feeds, ctr) } // Make list of public keys. LibSecp256k1.Point[] memory pubKeys = - new LibSecp256k1.Point[](feeds_.length); - for (uint i; i < feeds_.length; i++) { - pubKeys[i] = feeds_[i].pubKey; + new LibSecp256k1.Point[](feeds.length); + for (uint i; i < feeds.length; i++) { + pubKeys[i] = feeds[i].pubKey; } // Make signatures. IScribe.ECDSAData[] memory ecdsaDatas = - new IScribe.ECDSAData[](feeds_.length); - for (uint i; i < feeds_.length; i++) { - ecdsaDatas[i] = feeds_[i].signECDSA(FEED_REGISTRATION_MESSAGE); + new IScribe.ECDSAData[](feeds.length); + for (uint i; i < feeds.length; i++) { + ecdsaDatas[i] = feeds[i].signECDSA(FEED_REGISTRATION_MESSAGE); } - uint indexCtr = 1; - for (uint i; i < feeds_.length; i++) { - // Don't expect event for duplicates. - if (!addressFilter[feeds_[i].pubKey.toAddress()]) { - vm.expectEmit(); - emit FeedLifted( - address(this), feeds_[i].pubKey.toAddress(), indexCtr++ - ); - } - addressFilter[feeds_[i].pubKey.toAddress()] = true; + // Expect events. + for (uint i; i < feeds.length; i++) { + vm.expectEmit(); + emit FeedLifted(address(this), feeds[i].pubKey.toAddress()); } - uint[] memory indexes = scribe.lift(pubKeys, ecdsaDatas); - assertEq(indexes.length, pubKeys.length); - for (uint i; i < indexes.length; i++) { - assertTrue(indexes[i] != 0 && indexes[i] < pubKeys.length + 1); + // Lift feeds and verify returned feed ids. + uint8[] memory feedIds = scribe.lift(pubKeys, ecdsaDatas); + assertEq(feedIds.length, feeds.length); + for (uint i; i < feedIds.length; i++) { + assertEq(feedIds[i], feeds[i].id); } - // Check via feeds(address)(bool,uint) and feeds(uint)(bool,address). - bool ok; - uint index; + // Check via feeds(address)(bool) and feeds(uint8)(bool,address). + bool isFeed; + uint8 feedId; address feedAddr; - for (uint i; i < pubKeys.length; i++) { - (ok, index) = scribe.feeds(pubKeys[i].toAddress()); - assertTrue(ok); - // Note that the indexes are orders based on pubKeys' addresses. - assertTrue(index != 0); - - (ok, feedAddr) = scribe.feeds(index); - assertTrue(ok); - assertEq(pubKeys[i].toAddress(), feedAddr); + for (uint i; i < feeds.length; i++) { + isFeed = scribe.feeds(feeds[i].pubKey.toAddress()); + assertTrue(isFeed); + + feedId = uint8(uint(uint160(feeds[i].pubKey.toAddress())) >> 152); + + (isFeed, feedAddr) = scribe.feeds(feedId); + assertTrue(isFeed); + assertEq(feeds[i].pubKey.toAddress(), feedAddr); } - // Check via feeds()(address[],uint[]). - address[] memory addrs; - (addrs, indexes) = scribe.feeds(); - for (uint i; i < pubKeys.length; i++) { - for (uint j; j < addrs.length; j++) { - // Break inner loop if pubKey's address found in list of feeds. - if (pubKeys[i].toAddress() == addrs[j]) { + // Check via feeds()(address[]). + address[] memory feedAddrs = scribe.feeds(); + for (uint i; i < feeds.length; i++) { + for (uint j; j < feedAddrs.length; j++) { + // Break inner loop if feed's address found in list of feedAddrs. + if (feeds[i].pubKey.toAddress() == feedAddrs[j]) { break; } // Fail if pubKey's address not found in list of feeds. - if (j == addrs.length - 1) { - assertTrue(false); + if (j == feedAddrs.length - 1) { + fail("Expected feed missing in feeds()(address[])"); } } } } function test_lift_Multiple_FailsIf_ECDSADataInvalid() public { - uint privKeySigner = 1; - uint privKeyFeed = 2; - LibFeed.Feed[] memory feeds = new LibFeed.Feed[](2); - feeds[0] = LibFeed.newFeed(privKeySigner); - feeds[1] = LibFeed.newFeed(privKeyFeed); + feeds[0] = LibFeed.newFeed({privKey: 1}); + feeds[1] = LibFeed.newFeed({privKey: 2}); IScribe.ECDSAData[] memory ecdsaDatas = new IScribe.ECDSAData[](2); ecdsaDatas[0] = feeds[0].signECDSA(FEED_REGISTRATION_MESSAGE); @@ -595,33 +601,6 @@ abstract contract IScribeTest is Test { scribe.lift(pubKeys, ecdsaDatas); } - function test_lift_Multiple_FailsIf_MaxFeedsReached() public { - uint maxFeeds = scribe.maxFeeds(); - - // Make feeds. - LibFeed.Feed[] memory feeds = new LibFeed.Feed[](maxFeeds + 1); - for (uint i; i < maxFeeds + 1; i++) { - feeds[i] = LibFeed.newFeed(i + 1); - } - - // Make list of public keys. - LibSecp256k1.Point[] memory pubKeys = - new LibSecp256k1.Point[](maxFeeds + 1); - for (uint i; i < maxFeeds + 1; i++) { - pubKeys[i] = feeds[i].pubKey; - } - - // Make signatures. - IScribe.ECDSAData[] memory ecdsaDatas = - new IScribe.ECDSAData[](maxFeeds + 1); - for (uint i; i < maxFeeds + 1; i++) { - ecdsaDatas[i] = feeds[i].signECDSA(FEED_REGISTRATION_MESSAGE); - } - - vm.expectRevert(); - scribe.lift(pubKeys, ecdsaDatas); - } - function testFuzz_lift_Multiple_FailsIf_ArrayLengthMismatch( LibSecp256k1.Point[] memory pubKeys, IScribe.ECDSAData[] memory ecdsaDatas @@ -633,162 +612,114 @@ abstract contract IScribeTest is Test { } function testFuzz_drop_Single(uint privKey) public { - // Bound private key to secp256k1's order, i.e. scalar ∊ [1, Q). + // Let privKey ∊ [1, Q). privKey = bound(privKey, 1, LibSecp256k1.Q() - 1); LibFeed.Feed memory feed = LibFeed.newFeed(privKey); - uint index = + uint8 feedId = scribe.lift(feed.pubKey, feed.signECDSA(FEED_REGISTRATION_MESSAGE)); - assertEq(index, 1); vm.expectEmit(); - emit FeedDropped(address(this), feed.pubKey.toAddress(), 1); + emit FeedDropped(address(this), feed.pubKey.toAddress()); + + scribe.drop(feedId); - scribe.drop(1); + // Is idempotent. + scribe.drop(feedId); // Check via feeds(address)(bool). - bool ok; - (ok, index) = scribe.feeds(feed.pubKey.toAddress()); - assertFalse(ok); - assertEq(index, 0); + bool isFeed = scribe.feeds(feed.pubKey.toAddress()); + assertFalse(isFeed); // Check via feeds(uint)(bool,address). address feedAddr; - (ok, feedAddr) = scribe.feeds(1); - assertFalse(ok); - assertFalse(feedAddr == feed.pubKey.toAddress()); + (isFeed, feedAddr) = scribe.feeds(feedId); + assertFalse(isFeed); + assertEq(feedAddr, address(0)); - // Check via feeds()(address[],uint[]). - address[] memory feeds_; - uint[] memory indexes; - (feeds_, indexes) = scribe.feeds(); - assertEq(feeds_.length, indexes.length); + // Check via feeds()(address[]). + address[] memory feeds_ = scribe.feeds(); assertEq(feeds_.length, 0); } function testFuzz_drop_Multiple(uint[] memory privKeys) public { - // Bound private keys to secp256k1's order, i.e. scalar ∊ [1, Q). + // Let each privKey ∊ [1, Q). for (uint i; i < privKeys.length; i++) { - privKeys[i] = bound(privKeys[i], 1, LibSecp256k1.Q() - 1); + privKeys[i] = _bound(privKeys[i], 1, LibSecp256k1.Q() - 1); } - // Make feeds. - LibFeed.Feed[] memory feeds_ = new LibFeed.Feed[](privKeys.length); + // Make at most one feed per id. + LibFeed.Feed[] memory feeds = new LibFeed.Feed[](privKeys.length); + uint bloom; + uint ctr; for (uint i; i < privKeys.length; i++) { - feeds_[i] = LibFeed.newFeed(privKeys[i]); + LibFeed.Feed memory feed = LibFeed.newFeed(privKeys[i]); + + if (bloom & (1 << feed.id) == 0) { + bloom |= 1 << feed.id; + + feeds[ctr++] = feed; + } + } + assembly ("memory-safe") { + mstore(feeds, ctr) } // Make list of public keys. LibSecp256k1.Point[] memory pubKeys = - new LibSecp256k1.Point[](feeds_.length); - for (uint i; i < feeds_.length; i++) { - pubKeys[i] = feeds_[i].pubKey; + new LibSecp256k1.Point[](feeds.length); + for (uint i; i < feeds.length; i++) { + pubKeys[i] = feeds[i].pubKey; } // Make signatures. IScribe.ECDSAData[] memory ecdsaDatas = - new IScribe.ECDSAData[](feeds_.length); - for (uint i; i < feeds_.length; i++) { - ecdsaDatas[i] = feeds_[i].signECDSA(FEED_REGISTRATION_MESSAGE); + new IScribe.ECDSAData[](feeds.length); + for (uint i; i < feeds.length; i++) { + ecdsaDatas[i] = feeds[i].signECDSA(FEED_REGISTRATION_MESSAGE); } // Lift feeds. - uint[] memory indexes = scribe.lift(pubKeys, ecdsaDatas); + uint8[] memory feedIds = scribe.lift(pubKeys, ecdsaDatas); // Expect events. - uint indexCtr = 1; - for (uint i; i < pubKeys.length; i++) { + bloom = 0; + ctr = 0; + for (uint i; i < feeds.length; i++) { // Don't expect event for duplicates. - if (!addressFilter[pubKeys[i].toAddress()]) { + if (bloom & (1 << feeds[i].id) == 0) { + bloom |= 1 << feeds[i].id; + vm.expectEmit(); - emit FeedDropped( - address(this), pubKeys[i].toAddress(), indexCtr++ - ); + emit FeedDropped(address(this), feeds[i].pubKey.toAddress()); } - - addressFilter[pubKeys[i].toAddress()] = true; } // Drop feeds. - scribe.drop(indexes); + scribe.drop(feedIds); - // Check via feeds(address)(bool,uint). - bool ok; - uint index; - for (uint i; i < pubKeys.length; i++) { - (ok, index) = scribe.feeds(pubKeys[i].toAddress()); - assertFalse(ok); - assertEq(index, 0); - } + // Is idempotent. + scribe.drop(feedIds); - // Check via feeds()(address[],uint[]). - address[] memory feedAddresses; - uint[] memory feedIndexes; - (feedAddresses, feedIndexes) = scribe.feeds(); - assertEq(feedAddresses.length, feedIndexes.length); - assertEq(feedAddresses.length, 0); - } - - function test_drop_IndexZero() public { - // Does nothing. - scribe.drop(0); - } - - function testFuzz_drop_Single_FailsIf_IndexOutOfBounds(uint index) public { - vm.assume(index != 0); - - vm.expectRevert(); - scribe.drop(index); - } - - function testFuzz_drop_Multiple_FailsIf_IndexOutOfBounds( - uint[] memory indexes - ) public { - vm.assume(indexes.length != 0); - indexes[indexes.length - 1] = 1; - - vm.expectRevert(); - scribe.drop(indexes); - } - - function testFuzz_liftDropLift(uint privKey) public { - // Bound private key to secp256k1's order, i.e. scalar ∊ [1, Q). - privKey = bound(privKey, 1, LibSecp256k1.Q() - 1); - - LibFeed.Feed memory feed = LibFeed.newFeed(privKey); - - bool ok; - uint index; - - index = - scribe.lift(feed.pubKey, feed.signECDSA(FEED_REGISTRATION_MESSAGE)); - assertEq(index, 1); - (ok, index) = scribe.feeds(feed.pubKey.toAddress()); - assertTrue(ok); - assertEq(index, 1); - - scribe.drop(1); - (ok, index) = scribe.feeds(feed.pubKey.toAddress()); - assertFalse(ok); - assertEq(index, 0); + // Check via feeds(address)(bool). + bool isFeed; + for (uint i; i < feeds.length; i++) { + isFeed = scribe.feeds(feeds[i].pubKey.toAddress()); + assertFalse(isFeed); + } - // Note that lifting same feed again leads to an increased index - // nevertheless. - index = - scribe.lift(feed.pubKey, feed.signECDSA(FEED_REGISTRATION_MESSAGE)); - assertEq(index, 2); - (ok, index) = scribe.feeds(feed.pubKey.toAddress()); - assertTrue(ok); - assertEq(index, 2); + // Check via feeds(uint8)(bool,address). + address feedAddr; + for (uint i; i < feeds.length; i++) { + (isFeed, feedAddr) = scribe.feeds(feeds[i].id); + assertFalse(isFeed); + assertEq(feedAddr, address(0)); + } - address[] memory feedAddrs; - uint[] memory feedIndexes; - (feedAddrs, feedIndexes) = scribe.feeds(); - assertEq(feedAddrs.length, 1); - assertEq(feedIndexes.length, 1); - assertEq(feedAddrs[0], feed.pubKey.toAddress()); - assertEq(feedIndexes[0], 2); + // Check via feeds()(address[]). + address[] memory feedAddresses = scribe.feeds(); + assertEq(feedAddresses.length, 0); } function testFuzz_setBar(uint8 bar) public { @@ -870,7 +801,7 @@ abstract contract IScribeTest is Test { IAuth.NotAuthorized.selector, address(0xbeef) ) ); - scribe.drop(new uint[](1)); + scribe.drop(new uint8[](1)); } function test_setBar_IsAuthProtected() public { diff --git a/test/LibBytesTest.sol b/test/LibBytesTest.sol deleted file mode 100644 index 6cbdc44..0000000 --- a/test/LibBytesTest.sol +++ /dev/null @@ -1,59 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; - -import {Test} from "forge-std/Test.sol"; - -import {LibBytes} from "src/libs/LibBytes.sol"; - -abstract contract LibBytesTest is Test { - using LibBytes for uint; - - function testFuzz_getByteAtIndex(uint8 wantByte, uint indexSeed) public { - // Let index ∊ [0, 32). - uint index = bound(indexSeed, 0, 31); - - // Create word with wantByte at byte index. - uint word = uint(wantByte) << (index * 8); - - uint8 gotByte = uint8(word.getByteAtIndex(index)); - - assertEq(wantByte, gotByte); - } - - function test_getByteAtIndex() public { - uint word; - uint index; - uint want; - uint got; - - // Most significant byte. - word = - 0xFF11111111111111111111111111111111111111111111111111111111111111; - index = 31; - want = 0xFF; - got = word.getByteAtIndex(index); - assertEq(want, got); - - // Least significant byte. - word = - 0x11111111111111111111111111111111111111111111111111111111111111FF; - index = 0; - want = 0xFF; - got = word.getByteAtIndex(index); - assertEq(want, got); - - word = - 0x111111111111111111111111111111111111111111111111111111111111AA11; - index = 1; - want = 0xAA; - got = word.getByteAtIndex(index); - assertEq(want, got); - - word = - 0x1111001111111111111111111111111111111111111111111111111111111111; - index = 29; - want = 0x00; - got = word.getByteAtIndex(index); - assertEq(want, got); - } -} diff --git a/test/LibSchnorrDataTest.sol b/test/LibSchnorrDataTest.sol deleted file mode 100644 index ef8c780..0000000 --- a/test/LibSchnorrDataTest.sol +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; - -import {Test} from "forge-std/Test.sol"; -import {console2} from "forge-std/console2.sol"; - -import {IScribe} from "src/IScribe.sol"; - -import {LibSchnorrData} from "src/libs/LibSchnorrData.sol"; - -abstract contract LibSchnorrDataTest is Test { - using LibSchnorrData for IScribe.SchnorrData; - - function testFuzz_getSignerIndex(uint lengthSeed, uint indexSeed) public { - // Let length be ∊ [1, type(uint8).max]. - uint length = bound(lengthSeed, 1, type(uint8).max); - - // Let index be ∊ [0, length). - uint index = bound(indexSeed, 0, length - 1); - - bytes memory signersBlob; - for (uint i; i < length; i++) { - if (i == index) { - signersBlob = abi.encodePacked(signersBlob, uint8(0xFF)); - } else { - signersBlob = abi.encodePacked(signersBlob, uint8(1)); - } - } - - IScribe.SchnorrData memory schnorrData; - schnorrData.signersBlob = signersBlob; - - uint got = this.getSignerIndex(schnorrData, index); - assertEq(got, uint8(0xFF)); - } - - function testFuzz_getSingerIndex_ReturnsZeroIfIndexOutOfBounds( - uint lengthSeed, - uint indexSeed - ) public { - // Let length be ∊ [0, type(uint8).max]. - uint length = bound(lengthSeed, 0, type(uint8).max); - - // Let index be ∊ [length, type(uint8).max]. - // Note that index's upper limit is bounded is bounded by bar, which is - // of type uint8. - uint index = bound(indexSeed, length, type(uint8).max); - - bytes memory signersBlob; - for (uint i; i < length; i++) { - signersBlob = abi.encodePacked(signersBlob, uint8(1)); - } - - IScribe.SchnorrData memory schnorrData; - schnorrData.signersBlob = signersBlob; - - uint got = this.getSignerIndex(schnorrData, index); - assertEq(got, uint8(0)); - } - - function testFuzz_getSignerIndexLength(uint lengthSeed) public { - // Let length be ∊ [0, type(uint8).max]. - uint length = bound(lengthSeed, 0, type(uint8).max); - - bytes memory signersBlob; - for (uint i; i < length; i++) { - signersBlob = abi.encodePacked(signersBlob, uint8(1)); - } - - IScribe.SchnorrData memory schnorrData; - schnorrData.signersBlob = signersBlob; - - uint got = this.getSignerIndexLength(schnorrData); - assertEq(got, length); - } - - // -- Optimizations -- - - /// @dev Tests correctness of a possible optimization. - /// - /// Note that the optimization is currently not implemented. - function testFuzzOptimization_getSignerIndex_WordIndexComputation( - uint index - ) public { - // Current implementation: - uint want; - assembly ("memory-safe") { - want := mul(div(index, 32), 32) - } - - // Possible optimization: - uint mask = type(uint).max << 5; - uint got = index & mask; - - assertEq(want, got); - } - - /// @dev Tests correctness of a possible optimization. - /// - /// Note that the optimization is currently not implemented. - function testFuzzOptimization_getSignerIndex_ByteIndexComputation( - uint index - ) public { - // Current implementation: - uint want; - unchecked { - want = 31 - (index % 32); - } - - // Possible optimization: - uint mask = type(uint).max >> (256 - 5); - uint got = (~index) & mask; - - assertEq(want, got); - } - - // -- Executors -- - // - // Used to move memory structs into calldata. - - function getSignerIndex( - IScribe.SchnorrData calldata schnorrData, - uint index - ) public pure returns (uint) { - return schnorrData.getSignerIndex(index); - } - - function getSignerIndexLength(IScribe.SchnorrData calldata schnorrData) - public - pure - returns (uint) - { - return schnorrData.getSignerIndexLength(); - } -} diff --git a/test/LibSchnorrTest.sol b/test/LibSchnorrTest.sol index 25afc77..11f0b44 100644 --- a/test/LibSchnorrTest.sol +++ b/test/LibSchnorrTest.sol @@ -36,7 +36,7 @@ abstract contract LibSchnorrTest is Test { // Note that we allow double signing. uint[] memory privKeys = new uint[](privKeySeeds.length); for (uint i; i < privKeySeeds.length; i++) { - privKeys[i] = bound(privKeySeeds[i], 2, LibSecp256k1.Q() - 1); + privKeys[i] = _bound(privKeySeeds[i], 2, LibSecp256k1.Q() - 1); } // Make list of public key. @@ -79,7 +79,7 @@ abstract contract LibSchnorrTest is Test { bytes32 message ) public { // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); // Compute pubKey. LibSecp256k1.Point memory pubKey = privKey.derivePublicKey(); @@ -119,7 +119,7 @@ abstract contract LibSchnorrTest is Test { // Note that we allow double signing. uint[] memory privKeys = new uint[](privKeySeeds.length); for (uint i; i < privKeySeeds.length; i++) { - privKeys[i] = bound(privKeySeeds[i], 2, LibSecp256k1.Q() - 1); + privKeys[i] = _bound(privKeySeeds[i], 2, LibSecp256k1.Q() - 1); } // Make list of public key. @@ -166,7 +166,7 @@ abstract contract LibSchnorrTest is Test { vm.assume(signatureMask != 0); // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); // Sign message. uint signature; @@ -191,7 +191,7 @@ abstract contract LibSchnorrTest is Test { vm.assume(commitmentMask != 0); // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); // Sign message. uint signature; @@ -216,7 +216,7 @@ abstract contract LibSchnorrTest is Test { vm.assume(messageMask != 0); // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); // Sign message. uint signature; @@ -242,7 +242,7 @@ abstract contract LibSchnorrTest is Test { vm.assume(pubKeyXMask != 0 || flipParity); // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); // Sign message. uint signature; @@ -268,7 +268,7 @@ abstract contract LibSchnorrTest is Test { bytes32 message ) public { // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); // Sign message. uint signature; @@ -290,7 +290,7 @@ abstract contract LibSchnorrTest is Test { bytes32 message ) public { // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); // Sign message. uint signature; diff --git a/test/LibSecp256k1Test.sol b/test/LibSecp256k1Test.sol index 1c45d24..0ea626f 100644 --- a/test/LibSecp256k1Test.sol +++ b/test/LibSecp256k1Test.sol @@ -17,7 +17,7 @@ abstract contract LibSecp256k1Test is Test { function testFuzzDifferential_toAddress(uint privKeySeed) public { // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); address want = vm.addr(privKey); address got = privKey.derivePublicKey().toAddress(); @@ -43,7 +43,7 @@ abstract contract LibSecp256k1Test is Test { function testFuzz_isOnCurve(uint privKeySeed) public { // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); assertTrue(privKey.derivePublicKey().isOnCurve()); } @@ -56,7 +56,7 @@ abstract contract LibSecp256k1Test is Test { vm.assume(maskX != 0 || maskY != 0); // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); // Compute and mutate point. LibSecp256k1.Point memory p = privKey.derivePublicKey(); @@ -93,7 +93,7 @@ abstract contract LibSecp256k1Test is Test { function testFuzz_toJacobian_toAffine(uint privKeySeed) public { // Let privKey ∊ [1, Q). - uint privKey = bound(privKeySeed, 1, LibSecp256k1.Q() - 1); + uint privKey = _bound(privKeySeed, 1, LibSecp256k1.Q() - 1); LibSecp256k1.Point memory want = privKey.derivePublicKey(); LibSecp256k1.Point memory got = want.toJacobian().toAffine(); diff --git a/test/Runner.t.sol b/test/Runner.t.sol index 4a9cb8d..06d2557 100644 --- a/test/Runner.t.sol +++ b/test/Runner.t.sol @@ -49,15 +49,6 @@ import {LibSchnorrTest as LibSchnorrTest_} from "./LibSchnorrTest.sol"; contract LibSchnorrTest is LibSchnorrTest_ {} -import {LibBytesTest as LibBytesTest_} from "./LibBytesTest.sol"; - -contract LibBytesTest is LibBytesTest_ {} - -import {LibSchnorrDataTest as LibSchnorrDataTest_} from - "./LibSchnorrDataTest.sol"; - -contract LibSchnorrDataTest is LibSchnorrDataTest_ {} - // -- Test: EVM Requirements -- import {EVMTest} from "./EVMTest.sol"; diff --git a/test/inspectable/ScribeInspectable.sol b/test/inspectable/ScribeInspectable.sol index ae85d99..ef5efe7 100644 --- a/test/inspectable/ScribeInspectable.sol +++ b/test/inspectable/ScribeInspectable.sol @@ -14,23 +14,11 @@ contract ScribeInspectable is Scribe { return _pokeData; } - function inspectable_pubKeys() - public - view - returns (LibSecp256k1.Point[] memory) - { - return _pubKeys; - } - - function inspectable_pubKeys(uint index) + function inspectable_pubKeys(uint8 feedId) public view returns (LibSecp256k1.Point memory) { - return _unsafeLoadPubKeyAt(index); - } - - function inspectable_feeds(address addr) public view returns (uint) { - return _feeds[addr]; + return _pubKeys[feedId]; } } diff --git a/test/invariants/FeedSet.sol b/test/invariants/FeedSet.sol index 7beac0f..7cf2e93 100644 --- a/test/invariants/FeedSet.sol +++ b/test/invariants/FeedSet.sol @@ -71,4 +71,8 @@ library LibFeedSet { return s.feeds[seed % s.feeds.length]; } + + function count(FeedSet storage s) internal view returns (uint) { + return s.feeds.length; + } } diff --git a/test/invariants/IScribeInvariantTest.sol b/test/invariants/IScribeInvariantTest.sol index f7dd08b..eba3d85 100644 --- a/test/invariants/IScribeInvariantTest.sol +++ b/test/invariants/IScribeInvariantTest.sol @@ -57,104 +57,37 @@ abstract contract IScribeInvariantTest is Test { function invariant_poke_PokeTimestampsAreStrictlyMonotonicallyIncreasing() public { - // Get scribe's pokeData before the execution. + // Get scribe's pokeData before execution. IScribe.PokeData memory beforePokeData = handler.scribe_lastPokeData(); // Get scribe's current pokeData. IScribe.PokeData memory currentPokeData; currentPokeData = scribe.inspectable_pokeData(); - if (beforePokeData.age != currentPokeData.age) { - assertTrue(beforePokeData.age < currentPokeData.age); - } else { - assertEq(beforePokeData.age, currentPokeData.age); - } + assertTrue(beforePokeData.age <= currentPokeData.age); } - /* - function invariant_poke_PokeTimestampIsOnlyMutatedToCurrentTimestamp() - public - { - // Get scribe's pokeData before the execution. - IScribe.PokeData memory beforePokeData = handler.scribe_lastPokeData(); - - // Get scribe's current pokeData. - IScribe.PokeData memory currentPokeData; - currentPokeData = scribe.inspectable_pokeData(); - - if (beforePokeData.age != currentPokeData.age) { - assertEq(currentPokeData.age, uint32(block.timestamp)); - } - } - */ - // -- PubKeys -- - function invariant_pubKeys_AtIndexZeroIsZeroPoint() public { - assertTrue(scribe.inspectable_pubKeys(0).isZeroPoint()); - } - - mapping(bytes32 => bool) private pubKeyFilter; - - function invariant_pubKeys_NonZeroPubKeyExistsAtMostOnce() public { - LibSecp256k1.Point[] memory pubKeys = scribe.inspectable_pubKeys(); - for (uint i; i < pubKeys.length; i++) { - if (pubKeys[i].isZeroPoint()) continue; + function invariant_pubKeys_IndexedViaFeedId() public { + LibSecp256k1.Point memory pubKey; + uint8 feedId; - bytes32 id = keccak256(abi.encodePacked(pubKeys[i].x, pubKeys[i].y)); + for (uint i; i < 256; i++) { + pubKey = scribe.inspectable_pubKeys(uint8(i)); + feedId = uint8(uint(uint160(pubKey.toAddress())) >> 152); - assertFalse(pubKeyFilter[id]); - pubKeyFilter[id] = true; + assertTrue(pubKey.isZeroPoint() || i == feedId); } } - function invariant_pubKeys_LengthIsStrictlyMonotonicallyIncreasing() + function invariant_pubKeys_CannotIndexOutOfBoundsViaUint8Index() public + view { - uint lastLen = handler.scribe_lastPubKeysLength(); - uint currentLen = scribe.inspectable_pubKeys().length; - - assertTrue(lastLen <= currentLen); - } - - function invariant_pubKeys_ZeroPointIsNeverAddedAsPubKey() public { - uint lastLen = handler.scribe_lastPubKeysLength(); - - LibSecp256k1.Point[] memory pubKeys; - pubKeys = scribe.inspectable_pubKeys(); - - if (lastLen != pubKeys.length) { - assertFalse(pubKeys[pubKeys.length - 1].isZeroPoint()); - } - } - - // -- Feeds -- - - function invariant_feeds_ImageIsZeroToLengthOfPubKeys() public { - address[] memory feedAddrs = handler.ghost_feedAddresses(); - uint pubKeysLen = scribe.inspectable_pubKeys().length; - - for (uint i; i < feedAddrs.length; i++) { - uint index = scribe.inspectable_feeds(feedAddrs[i]); - - assertTrue(index < pubKeysLen); - } - } - - function invariant_feeds_LinkToTheirPublicKeys() public { - address[] memory feedAddrs = handler.ghost_feedAddresses(); - - LibSecp256k1.Point[] memory pubKeys; - pubKeys = scribe.inspectable_pubKeys(); - - LibSecp256k1.Point memory pubKey; - for (uint i; i < feedAddrs.length; i++) { - uint index = scribe.inspectable_feeds(feedAddrs[i]); - - pubKey = pubKeys[index]; - if (!pubKey.isZeroPoint()) { - assertEq(pubKey.toAddress(), feedAddrs[i]); - } + for (uint i; i <= type(uint8).max; i++) { + // Should not revert. + scribe.inspectable_pubKeys(uint8(i)); } } diff --git a/test/invariants/ScribeHandler.sol b/test/invariants/ScribeHandler.sol index 1e6da65..4d7aff9 100644 --- a/test/invariants/ScribeHandler.sol +++ b/test/invariants/ScribeHandler.sol @@ -29,16 +29,13 @@ contract ScribeHandler is CommonBase, StdUtils { IScribe public scribe; IScribe.PokeData internal _scribe_lastPokeData; - uint public scribe_lastPubKeysLength; - uint internal nextPrivKey = 2; - FeedSet internal feedSet; + uint internal _nextPrivKey = 2; + FeedSet internal _feedSet; modifier cacheScribeState() { // forgefmt: disable-next-item _scribe_lastPokeData = ScribeInspectable(address(scribe)).inspectable_pokeData(); - // forgefmt: disable-next-item - scribe_lastPubKeysLength = ScribeInspectable(address(scribe)).inspectable_pubKeys().length; _; } @@ -48,37 +45,38 @@ contract ScribeHandler is CommonBase, StdUtils { // Cache constants. WAT = scribe.wat(); FEED_REGISTRATION_MESSAGE = scribe.feedRegistrationMessage(); - - _ensureBarFeedsLifted(); } function _ensureBarFeedsLifted() internal { uint bar = scribe.bar(); - (address[] memory feeds,) = scribe.feeds(); + address[] memory feeds = scribe.feeds(); if (feeds.length < bar) { // Lift feeds until bar is reached. uint missing = bar - feeds.length; LibFeed.Feed memory feed; - for (uint i; i < missing; i++) { - feed = LibFeed.newFeed(nextPrivKey++); + while (missing != 0) { + feed = LibFeed.newFeed(_nextPrivKey++); + + // Continue if feed's id already lifted. + (bool isFeed,) = scribe.feeds(feed.id); + if (isFeed) continue; - // Lift feed and set its index. - uint index = scribe.lift( + // Otherwise lift feed and add to feedSet. + scribe.lift( feed.pubKey, feed.signECDSA(FEED_REGISTRATION_MESSAGE) ); - feed.index = uint8(index); + _feedSet.add({feed: feed, lifted: true}); - // Store feed in feedSet. - feedSet.add(feed, true); + missing--; } } } // -- Target Functions -- - function warp(uint seed) external { - uint amount = bound(seed, 1, 1 hours); + function warp(uint seed) external cacheScribeState { + uint amount = _bound(seed, 1, 1 hours); vm.warp(block.timestamp + amount); } @@ -94,7 +92,7 @@ contract ScribeHandler is CommonBase, StdUtils { } // Get set of bar many feeds from feedSet. - LibFeed.Feed[] memory feeds = feedSet.liftedFeeds(scribe.bar()); + LibFeed.Feed[] memory feeds = _feedSet.liftedFeeds(scribe.bar()); // Create pokeData. IScribe.PokeData memory pokeData = IScribe.PokeData({ @@ -122,34 +120,31 @@ contract ScribeHandler is CommonBase, StdUtils { function lift() external cacheScribeState { // Create new feed. - LibFeed.Feed memory feed = LibFeed.newFeed(nextPrivKey++); + LibFeed.Feed memory feed = LibFeed.newFeed(_nextPrivKey++); - // Lift feed and set its index. - uint index = - scribe.lift(feed.pubKey, feed.signECDSA(FEED_REGISTRATION_MESSAGE)); - feed.index = uint8(index); + // Return if feed's id already lifted. + (bool isFeed,) = scribe.feeds(feed.id); + if (isFeed) return; - // Store feed in feedSet. - feedSet.add(feed, true); + // Lift feed and add to feedSet. + scribe.lift(feed.pubKey, feed.signECDSA(FEED_REGISTRATION_MESSAGE)); + _feedSet.add({feed: feed, lifted: true}); } function drop(uint seed) external cacheScribeState { + if (_feedSet.count() == 0) return; + // Get random feed from feedSet. // Note that feed may not be lifted. - LibFeed.Feed memory feed = LibFeedSet.rand(feedSet, seed); - - // Receive index of feed. Index is zero if not lifted. - (, uint index) = scribe.feeds(feed.pubKey.toAddress()); - - // Drop feed. - scribe.drop(index); + LibFeed.Feed memory feed = _feedSet.rand(seed); - // Mark feed as non-lifted in feedSet. - feedSet.updateLifted(feed, false); + // Drop feed and mark as non-lifted in feedSet. + scribe.drop(feed.id); + _feedSet.updateLifted({feed: feed, lifted: false}); } function setBar(uint barSeed) external cacheScribeState { - uint8 newBar = uint8(bound(barSeed, 0, MAX_BAR)); + uint8 newBar = uint8(_bound(barSeed, 0, MAX_BAR)); // Should revert if newBar is 0. try scribe.setBar(newBar) {} catch {} @@ -166,22 +161,22 @@ contract ScribeHandler is CommonBase, StdUtils { } function ghost_feedAddresses() external view returns (address[] memory) { - address[] memory addrs = new address[](feedSet.feeds.length); + address[] memory addrs = new address[](_feedSet.feeds.length); for (uint i; i < addrs.length; i++) { - addrs[i] = feedSet.feeds[i].pubKey.toAddress(); + addrs[i] = _feedSet.feeds[i].pubKey.toAddress(); } return addrs; } // -- Helpers -- - function _randPokeDataVal(uint seed) internal view returns (uint128) { - uint val = bound(seed, 0, type(uint128).max); + function _randPokeDataVal(uint seed) internal pure returns (uint128) { + uint val = _bound(seed, 0, type(uint128).max); return uint128(val); } function _randPokeDataAge(uint seed) internal view returns (uint32) { - uint age = bound(seed, _scribe_lastPokeData.age + 1, block.timestamp); + uint age = _bound(seed, _scribe_lastPokeData.age + 1, block.timestamp); return uint32(age); } }