Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

feat: updating global vars with fees #4421

Merged
merged 18 commits into from
Feb 7, 2024
Merged
74 changes: 32 additions & 42 deletions l1-contracts/slither_output.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ Summary
- [low-level-calls](#low-level-calls) (1 results) (Informational)
- [similar-names](#similar-names) (1 results) (Informational)
- [unused-state](#unused-state) (2 results) (Informational)
- [pess-magic-number](#pess-magic-number) (1 results) (Informational)
- [constable-states](#constable-states) (1 results) (Optimization)
## pess-unprotected-setter
Impact: High
Expand All @@ -27,9 +26,9 @@ src/core/Rollup.sol#L54-L94
Impact: Medium
Confidence: Medium
- [ ] ID-1
[HeaderLib.decode(bytes).header](src/core/libraries/HeaderLib.sol#L133) is a local variable never initialized
[HeaderLib.decode(bytes).header](src/core/libraries/HeaderLib.sol#L139) is a local variable never initialized

src/core/libraries/HeaderLib.sol#L133
src/core/libraries/HeaderLib.sol#L139


## unused-return
Expand Down Expand Up @@ -59,43 +58,45 @@ src/core/libraries/decoders/Decoder.sol#L415-L417


- [ ] ID-5
Dubious typecast in [HeaderLib.decode(bytes)](src/core/libraries/HeaderLib.sol#L134-L175):
bytes => bytes32 casting occurs in [header.lastArchive = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L142-L144)
bytes => bytes4 casting occurs in [header.lastArchive = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L142-L144)
bytes => bytes32 casting occurs in [header.bodyHash = bytes32(_header)](src/core/libraries/HeaderLib.sol#L147)
bytes => bytes32 casting occurs in [header.stateReference.l1ToL2MessageTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L150-L152)
bytes => bytes4 casting occurs in [header.stateReference.l1ToL2MessageTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L150-L152)
bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.noteHashTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L153-L155)
bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.noteHashTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L153-L155)
bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.nullifierTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L156-L158)
bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.nullifierTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L156-L158)
bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.contractTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L159-L161)
bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.contractTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L159-L161)
bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.publicDataTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L162-L164)
bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.publicDataTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L162-L164)
bytes => bytes32 casting occurs in [header.globalVariables.chainId = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L167)
bytes => bytes32 casting occurs in [header.globalVariables.version = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L168)
bytes => bytes32 casting occurs in [header.globalVariables.blockNumber = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L169)
bytes => bytes32 casting occurs in [header.globalVariables.timestamp = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L170)
bytes => bytes20 casting occurs in [header.globalVariables.coinbase = address(bytes20(_header))](src/core/libraries/HeaderLib.sol#L171)
bytes => bytes32 casting occurs in [header.globalVariables.feeRecipient = bytes32(_header)](src/core/libraries/HeaderLib.sol#L172)

src/core/libraries/HeaderLib.sol#L134-L175


- [ ] ID-6
Dubious typecast in [Outbox.sendL1Messages(bytes32[])](src/core/messagebridge/Outbox.sol#L38-L46):
uint256 => uint32 casting occurs in [version = uint32(REGISTRY.getVersionFor(msg.sender))](src/core/messagebridge/Outbox.sol#L40)

src/core/messagebridge/Outbox.sol#L38-L46


- [ ] ID-6
- [ ] ID-7
Dubious typecast in [Inbox.sendL2Message(DataStructures.L2Actor,uint32,bytes32,bytes32)](src/core/messagebridge/Inbox.sol#L45-L91):
uint256 => uint64 casting occurs in [fee = uint64(msg.value)](src/core/messagebridge/Inbox.sol#L64)
uint256 => uint32 casting occurs in [entries.insert(key,fee,uint32(_recipient.version),_deadline,_errIncompatibleEntryArguments)](src/core/messagebridge/Inbox.sol#L76)

src/core/messagebridge/Inbox.sol#L45-L91


- [ ] ID-7
Dubious typecast in [HeaderLib.decode(bytes)](src/core/libraries/HeaderLib.sol#L128-L167):
bytes => bytes32 casting occurs in [header.lastArchive = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L136-L138)
bytes => bytes4 casting occurs in [header.lastArchive = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L136-L138)
bytes => bytes32 casting occurs in [header.bodyHash = bytes32(_header)](src/core/libraries/HeaderLib.sol#L141)
bytes => bytes32 casting occurs in [header.stateReference.l1ToL2MessageTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L144-L146)
bytes => bytes4 casting occurs in [header.stateReference.l1ToL2MessageTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L144-L146)
bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.noteHashTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L147-L149)
bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.noteHashTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L147-L149)
bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.nullifierTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L150-L152)
bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.nullifierTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L150-L152)
bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.contractTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L153-L155)
bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.contractTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L153-L155)
bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.publicDataTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L156-L158)
bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.publicDataTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L156-L158)
bytes => bytes32 casting occurs in [header.globalVariables.chainId = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L161)
bytes => bytes32 casting occurs in [header.globalVariables.version = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L162)
bytes => bytes32 casting occurs in [header.globalVariables.blockNumber = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L163)
bytes => bytes32 casting occurs in [header.globalVariables.timestamp = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L164)

src/core/libraries/HeaderLib.sol#L128-L167


- [ ] ID-8
Dubious typecast in [MessagesDecoder.read4(bytes,uint256)](src/core/libraries/decoders/MessagesDecoder.sol#L110-L112):
bytes => bytes4 casting occurs in [uint256(uint32(bytes4(_data)))](src/core/libraries/decoders/MessagesDecoder.sol#L111)
Expand Down Expand Up @@ -151,11 +152,11 @@ src/core/messagebridge/Inbox.sol#L45-L91


- [ ] ID-14
[HeaderLib.validate(HeaderLib.Header,uint256,uint256,bytes32)](src/core/libraries/HeaderLib.sol#L91-L121) uses timestamp for comparisons
[HeaderLib.validate(HeaderLib.Header,uint256,uint256,bytes32)](src/core/libraries/HeaderLib.sol#L97-L127) uses timestamp for comparisons
Dangerous comparisons:
- [_header.globalVariables.timestamp > block.timestamp](src/core/libraries/HeaderLib.sol#L105)
- [_header.globalVariables.timestamp > block.timestamp](src/core/libraries/HeaderLib.sol#L111)

src/core/libraries/HeaderLib.sol#L91-L121
src/core/libraries/HeaderLib.sol#L97-L127


- [ ] ID-15
Expand Down Expand Up @@ -361,21 +362,10 @@ src/core/libraries/decoders/Decoder.sol#L103-L104
src/core/libraries/decoders/Decoder.sol#L107-L108


## pess-magic-number
Impact: Informational
Confidence: High
- [ ] ID-43
Magic number 376 is used multiple times in:
[_header.length != 376](src/core/libraries/HeaderLib.sol#L129)
[Errors.HeaderLib__InvalidHeaderSize(376,_header.length)](src/core/libraries/HeaderLib.sol#L130)

src/core/libraries/HeaderLib.sol#L129


## constable-states
Impact: Optimization
Confidence: High
- [ ] ID-44
- [ ] ID-43
[Rollup.lastWarpedBlockTs](src/core/Rollup.sol#L37) should be constant

src/core/Rollup.sol#L37
Expand Down
10 changes: 5 additions & 5 deletions l1-contracts/src/core/libraries/ConstantsGen.sol
Original file line number Diff line number Diff line change
Expand Up @@ -82,17 +82,17 @@ library Constants {
uint256 internal constant MAX_NOTES_PER_PAGE = 10;
uint256 internal constant VIEW_NOTE_ORACLE_RETURN_LENGTH = 212;
uint256 internal constant CALL_CONTEXT_LENGTH = 8;
uint256 internal constant GLOBAL_VARIABLES_LENGTH = 4;
uint256 internal constant GLOBAL_VARIABLES_LENGTH = 6;
uint256 internal constant PARTIAL_STATE_REFERENCE_LENGTH = 8;
uint256 internal constant STATE_REFERENCE_LENGTH = 10;
uint256 internal constant HEADER_LENGTH = 18;
uint256 internal constant HEADER_LENGTH = 20;
uint256 internal constant FUNCTION_DATA_LENGTH = 4;
uint256 internal constant CONTRACT_DEPLOYMENT_DATA_LENGTH = 6;
uint256 internal constant PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH = 205;
uint256 internal constant PRIVATE_CALL_STACK_ITEM_LENGTH = 210;
uint256 internal constant PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH = 207;
uint256 internal constant PRIVATE_CALL_STACK_ITEM_LENGTH = 212;
uint256 internal constant CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH = 3;
uint256 internal constant CONTRACT_STORAGE_READ_LENGTH = 2;
uint256 internal constant PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH = 201;
uint256 internal constant PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH = 203;
uint256 internal constant GET_NOTES_ORACLE_RETURN_LENGTH = 674;
uint256 internal constant COMMITMENTS_NUM_BYTES_PER_BASE_ROLLUP = 2048;
uint256 internal constant NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP = 2048;
Expand Down
12 changes: 10 additions & 2 deletions l1-contracts/src/core/libraries/HeaderLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ import {Hash} from "./Hash.sol";
* | 0x0118 | 0x20 | version
* | 0x0138 | 0x20 | blockNumber
* | 0x0158 | 0x20 | timestamp
* | 0x0178 | 0x14 | coinbase
* | 0x018c | 0x20 | feeRecipient
* | | | }
* | | | }
* | --- | --- | ---
Expand Down Expand Up @@ -72,6 +74,8 @@ library HeaderLib {
uint256 version;
uint256 blockNumber;
uint256 timestamp;
address coinbase;
bytes32 feeRecipient;
}

struct Header {
Expand All @@ -81,6 +85,8 @@ library HeaderLib {
GlobalVariables globalVariables;
}

uint256 private constant HEADER_LENGTH = 0x1ac; // Header byte length

/**
* @notice Validates the header
* @param _header - The decoded header
Expand Down Expand Up @@ -126,8 +132,8 @@ library HeaderLib {
* @return The decoded header
*/
function decode(bytes calldata _header) internal pure returns (Header memory) {
if (_header.length != 376) {
revert Errors.HeaderLib__InvalidHeaderSize(376, _header.length);
if (_header.length != HEADER_LENGTH) {
revert Errors.HeaderLib__InvalidHeaderSize(HEADER_LENGTH, _header.length);
}

Header memory header;
Expand Down Expand Up @@ -162,6 +168,8 @@ library HeaderLib {
header.globalVariables.version = uint256(bytes32(_header[0x0118:0x0138]));
header.globalVariables.blockNumber = uint256(bytes32(_header[0x0138:0x0158]));
header.globalVariables.timestamp = uint256(bytes32(_header[0x0158:0x0178]));
header.globalVariables.coinbase = address(bytes20(_header[0x0178:0x018c]));
header.globalVariables.feeRecipient = bytes32(_header[0x018c:HEADER_LENGTH]);

return header;
}
Expand Down
2 changes: 2 additions & 0 deletions l1-contracts/test/decoders/Base.sol
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ contract DecoderBase is Test {
struct GlobalVariables {
uint256 blockNumber;
uint256 chainId;
address coinbase;
bytes32 feeRecipient;
uint256 timestamp;
uint256 version;
}
Expand Down
4 changes: 4 additions & 0 deletions l1-contracts/test/decoders/Decoder.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ contract DecoderTest is DecoderBase {
assertEq(header.globalVariables.chainId, globalVariables.chainId, "Invalid chain Id");
assertEq(header.globalVariables.timestamp, globalVariables.timestamp, "Invalid timestamp");
assertEq(header.globalVariables.version, globalVariables.version, "Invalid version");
assertEq(header.globalVariables.coinbase, globalVariables.coinbase, "Invalid coinbase");
assertEq(
header.globalVariables.feeRecipient, globalVariables.feeRecipient, "Invalid feeRecipient"
);
}

// StateReference
Expand Down
12 changes: 7 additions & 5 deletions l1-contracts/test/fixtures/empty_block_0.json

Large diffs are not rendered by default.

14 changes: 8 additions & 6 deletions l1-contracts/test/fixtures/empty_block_1.json

Large diffs are not rendered by default.

18 changes: 10 additions & 8 deletions l1-contracts/test/fixtures/mixed_block_0.json

Large diffs are not rendered by default.

20 changes: 11 additions & 9 deletions l1-contracts/test/fixtures/mixed_block_1.json

Large diffs are not rendered by default.

12 changes: 11 additions & 1 deletion yarn-project/aztec-node/src/aztec-node/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {
import {
ARCHIVE_HEIGHT,
CONTRACT_TREE_HEIGHT,
EthAddress,
Fr,
Header,
L1_TO_L2_MSG_TREE_HEIGHT,
Expand Down Expand Up @@ -550,7 +551,16 @@ export class AztecNodeService implements AztecNode {
public async simulatePublicCalls(tx: Tx) {
this.log.info(`Simulating tx ${await tx.getTxHash()}`);
const blockNumber = (await this.blockSource.getBlockNumber()) + 1;
const newGlobalVariables = await this.globalVariableBuilder.buildGlobalVariables(new Fr(blockNumber));

// If sequencer is not initialized, we just set these values to zero for simulation.
const coinbase = this.sequencer?.coinbase || EthAddress.ZERO;
const feeRecipient = this.sequencer?.feeRecipient || AztecAddress.ZERO;

const newGlobalVariables = await this.globalVariableBuilder.buildGlobalVariables(
new Fr(blockNumber),
coinbase,
feeRecipient,
);
const prevHeader = (await this.blockSource.getBlock(-1))?.header;

// Instantiate merkle trees so uncommitted updates by this simulation are local to it.
Expand Down
16 changes: 13 additions & 3 deletions yarn-project/aztec-nr/aztec/src/abi.nr
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use dep::protocol_types::{
private_circuit_public_inputs::PrivateCircuitPublicInputs,
public_circuit_public_inputs::PublicCircuitPublicInputs,
},
address::{AztecAddress, EthAddress},
contrakt::deployment_data::ContractDeploymentData,
hash::hash_args,
traits::{Hash, Serialize},
Expand All @@ -29,12 +30,21 @@ struct PublicGlobalVariables {
version: Field,
block_number: Field,
timestamp: Field,
coinbase: EthAddress,
fee_recipient: AztecAddress,
}
// docs:end:public-global-variables

impl Serialize<4> for PublicGlobalVariables {
fn serialize(self) -> [Field; 4] {
[self.chain_id, self.version, self.block_number, self.timestamp]
impl Serialize<6> for PublicGlobalVariables {
Copy link
Contributor

Choose a reason for hiding this comment

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

I think this implementation is already in the types in global_variables.nr, should we not just be importing that so we don't end up repeating.

If not removing it, can you use the constant value instead of a hardcoded number in here?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Makes sense. I will try removing it in the PR up the stack.

fn serialize(self) -> [Field; 6] {
[
self.chain_id,
self.version,
self.block_number,
self.timestamp,
self.coinbase.to_field(),
self.fee_recipient.to_field(),
]
}
}

Expand Down
8 changes: 8 additions & 0 deletions yarn-project/aztec-nr/aztec/src/context/public.nr
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,14 @@ impl PublicContext {
self.inputs.public_global_variables.timestamp
}

pub fn coinbase(self) -> EthAddress {
self.inputs.public_global_variables.coinbase
}

pub fn fee_recipient(self) -> AztecAddress {
self.inputs.public_global_variables.fee_recipient
}

pub fn finish(self) -> PublicCircuitPublicInputs {
// TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)
let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];
Expand Down
1 change: 0 additions & 1 deletion yarn-project/aztec-nr/aztec/src/messaging.nr
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ mod l1_to_l2_message_getter_data;

use l1_to_l2_message_getter_data::make_l1_to_l2_message_getter_data;

use crate::abi::PublicContextInputs;
use crate::oracle::get_l1_to_l2_message::get_l1_to_l2_message_call;

use dep::std::merkle::compute_merkle_root;
Expand Down
7 changes: 1 addition & 6 deletions yarn-project/aztec-nr/aztec/src/note/lifecycle.nr
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use crate::abi::PublicContextInputs;
use crate::context::{
PrivateContext,
PublicContext,
Expand Down Expand Up @@ -35,11 +34,7 @@ pub fn create_note<Note, N>(
}
}

pub fn create_note_hash_from_public<Note, N>(
context: &mut PublicContext,
storage_slot: Field,
note: &mut Note
) where Note: NoteInterface<N> {
pub fn create_note_hash_from_public<Note, N>(context: &mut PublicContext, storage_slot: Field, note: &mut Note) where Note: NoteInterface<N> {
let contract_address = (*context).this_address();

let header = NoteHeader { contract_address, storage_slot, nonce: 0, is_transient: true };
Expand Down
1 change: 0 additions & 1 deletion yarn-project/aztec-nr/aztec/src/state_vars/set.nr
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use dep::std::option::Option;
use crate::abi::PublicContextInputs;
use dep::protocol_types::{
constants::{MAX_NOTES_PER_PAGE, MAX_READ_REQUESTS_PER_CALL},
abis::side_effect::{SideEffect, SideEffectLinkedToNoteHash},
Expand Down
18 changes: 9 additions & 9 deletions yarn-project/circuit-types/src/interfaces/configs.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import { AztecAddress, EthAddress } from '@aztec/circuits.js';

/**
* The sequencer configuration.
*/
export interface SequencerConfig {
/**
* The number of ms to wait between polling for pending txs.
*/
/** The number of ms to wait between polling for pending txs. */
transactionPollingIntervalMS?: number;
/**
* The maximum number of txs to include in a block.
*/
/** The maximum number of txs to include in a block. */
maxTxsPerBlock?: number;
/**
* The minimum number of txs to include in a block.
*/
/** The minimum number of txs to include in a block. */
minTxsPerBlock?: number;
/** Recipient of block reward. */
coinbase?: EthAddress;
/** Address to receive fees. */
feeRecipient?: AztecAddress;
}
Loading
Loading