You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
8.1 KiB

Redo coordinator structure, connect API to node - API: - Modify the constructor so that hardcoded rollup constants don't need to be passed (introduce a `Config` and use `configAPI` internally) - Common: - Update rollup constants with proper *big.Int when required - Add BidCoordinator and Slot structs used by the HistoryDB and Synchronizer. - Add helper methods to AuctionConstants - AuctionVariables: Add column `DefaultSlotSetBidSlotNum` (in the SQL table: `default_slot_set_bid_slot_num`), which indicates at which slotNum does the `DefaultSlotSetBid` specified starts applying. - Config: - Move coordinator exclusive configuration from the node config to the coordinator config - Coordinator: - Reorganize the code towards having the goroutines started and stopped from the coordinator itself instead of the node. - Remove all stop and stopped channels, and use context.Context and sync.WaitGroup instead. - Remove BatchInfo setters and assing variables directly - In ServerProof and ServerProofPool use context instead stop channel. - Use message passing to notify the coordinator about sync updates and reorgs - Introduce the Pipeline, which can be started and stopped by the Coordinator - Introduce the TxManager, which manages ethereum transactions (the TxManager is also in charge of making the forge call to the rollup smart contract). The TxManager keeps ethereum transactions and: 1. Waits for the transaction to be accepted 2. Waits for the transaction to be confirmed for N blocks - In forge logic, first prepare a batch and then wait for an available server proof to have all work ready once the proof server is ready. - Remove the `isForgeSequence` method which was querying the smart contract, and instead use notifications sent by the Synchronizer to figure out if it's forging time. - Update test (which is a minimal test to manually see if the coordinator starts) - HistoryDB: - Add method to get the number of batches in a slot (used to detect when a slot has passed the bid winner forging deadline) - Add method to get the best bid and associated coordinator of a slot (used to detect the forgerAddress that can forge the slot) - General: - Rename some instances of `currentBlock` to `lastBlock` to be more clear. - Node: - Connect the API to the node and call the methods to update cached state when the sync advances blocks. - Call methods to update Coordinator state when the sync advances blocks and finds reorgs. - Synchronizer: - Add Auction field in the Stats, which contain the current slot with info about highest bidder and other related info required to know who can forge in the current block. - Better organization of cached state: - On Sync, update the internal cached state - On Init or Reorg, load the state from HistoryDB into the internal cached state.
3 years ago
  1. package common
  2. import (
  3. "fmt"
  4. "math/big"
  5. ethCommon "github.com/ethereum/go-ethereum/common"
  6. "github.com/ethereum/go-ethereum/crypto"
  7. "github.com/hermeznetwork/tracerr"
  8. )
  9. const (
  10. // RollupConstMaxFeeIdxCoordinator is the maximum number of tokens the
  11. // coordinator can use to collect fees (determines the number of tokens
  12. // that the coordinator can collect fees from). This value is
  13. // determined by the circuit.
  14. RollupConstMaxFeeIdxCoordinator = 64
  15. // RollupConstReservedIDx First 256 indexes reserved, first user index will be the 256
  16. RollupConstReservedIDx = 255
  17. // RollupConstExitIDx IDX 1 is reserved for exits
  18. RollupConstExitIDx = 1
  19. // RollupConstLimitTokens Max number of tokens allowed to be registered inside the rollup
  20. RollupConstLimitTokens = (1 << 32)
  21. // RollupConstL1CoordinatorTotalBytes [4 bytes] token + [32 bytes] babyjub + [65 bytes] compressedSignature
  22. RollupConstL1CoordinatorTotalBytes = 101
  23. // RollupConstL1UserTotalBytes [20 bytes] fromEthAddr + [32 bytes] fromBjj-compressed + [6 bytes] fromIdx +
  24. // [2 bytes] depositAmountFloat16 + [2 bytes] amountFloat16 + [4 bytes] tokenId + [6 bytes] toIdx
  25. RollupConstL1UserTotalBytes = 72
  26. // RollupConstMaxL1UserTx Maximum L1-user transactions allowed to be queued in a batch
  27. RollupConstMaxL1UserTx = 128
  28. // RollupConstMaxL1Tx Maximum L1 transactions allowed to be queued in a batch
  29. RollupConstMaxL1Tx = 256
  30. // RollupConstInputSHAConstantBytes [6 bytes] lastIdx + [6 bytes] newLastIdx + [32 bytes] stateRoot + [32 bytes] newStRoot + [32 bytes] newExitRoot +
  31. // [_MAX_L1_TX * _L1_USER_TOTALBYTES bytes] l1TxsData + totalL2TxsDataLength + feeIdxCoordinatorLength + [2 bytes] chainID =
  32. // 18542 bytes + totalL2TxsDataLength + feeIdxCoordinatorLength
  33. RollupConstInputSHAConstantBytes = 18546
  34. // RollupConstNumBuckets Number of buckets
  35. RollupConstNumBuckets = 5
  36. // RollupConstMaxWithdrawalDelay max withdrawal delay in seconds
  37. RollupConstMaxWithdrawalDelay = 2 * 7 * 24 * 60 * 60
  38. // RollupConstExchangeMultiplier exchange multiplier
  39. RollupConstExchangeMultiplier = 1e14
  40. // LenVerifiers number of Rollup Smart Contract Verifiers
  41. LenVerifiers = 1
  42. )
  43. var (
  44. // RollupConstLimitDepositAmount Max deposit amount allowed (depositAmount: L1 --> L2)
  45. RollupConstLimitDepositAmount, _ = new(big.Int).SetString("340282366920938463463374607431768211456", 10)
  46. // RollupConstLimitL2TransferAmount Max amount allowed (amount L2 --> L2)
  47. RollupConstLimitL2TransferAmount, _ = new(big.Int).SetString("6277101735386680763835789423207666416102355444464034512896", 10)
  48. // RollupConstEthAddressInternalOnly This ethereum address is used internally for rollup accounts that don't have ethereum address, only Babyjubjub
  49. // This non-ethereum accounts can be created by the coordinator and allow users to have a rollup
  50. // account without needing an ethereum address
  51. RollupConstEthAddressInternalOnly = ethCommon.HexToAddress("0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF")
  52. // RollupConstRfield Modulus zkSNARK
  53. RollupConstRfield, _ = new(big.Int).SetString(
  54. "21888242871839275222246405745257275088548364400416034343698204186575808495617", 10)
  55. // RollupConstERC1820 ERC1820Registry address
  56. RollupConstERC1820 = ethCommon.HexToAddress("0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24")
  57. // ERC777 tokens signatures
  58. // RollupConstRecipientInterfaceHash ERC777 recipient interface hash
  59. RollupConstRecipientInterfaceHash = crypto.Keccak256([]byte("ERC777TokensRecipient"))
  60. // RollupConstPerformL1UserTxSignature the signature of the function that can be called thru an ERC777 `send`
  61. RollupConstPerformL1UserTxSignature = crypto.Keccak256([]byte("addL1Transaction(uint256,uint48,uint16,uint16,uint32,uint48)"))
  62. // RollupConstAddTokenSignature the signature of the function that can be called thru an ERC777 `send`
  63. RollupConstAddTokenSignature = crypto.Keccak256([]byte("addToken(address)"))
  64. // RollupConstSendSignature ERC777 Signature
  65. RollupConstSendSignature = crypto.Keccak256([]byte("send(address,uint256,bytes)"))
  66. // RollupConstERC777Granularity ERC777 Signature
  67. RollupConstERC777Granularity = crypto.Keccak256([]byte("granularity()"))
  68. // RollupConstWithdrawalDelayerDeposit This constant are used to deposit tokens from ERC77 tokens into withdrawal delayer
  69. RollupConstWithdrawalDelayerDeposit = crypto.Keccak256([]byte("deposit(address,address,uint192)"))
  70. // ERC20 signature
  71. // RollupConstTransferSignature This constant is used in the _safeTransfer internal method in order to safe GAS.
  72. RollupConstTransferSignature = crypto.Keccak256([]byte("transfer(address,uint256)"))
  73. // RollupConstTransferFromSignature This constant is used in the _safeTransfer internal method in order to safe GAS.
  74. RollupConstTransferFromSignature = crypto.Keccak256([]byte("transferFrom(address,address,uint256)"))
  75. // RollupConstApproveSignature This constant is used in the _safeTransfer internal method in order to safe GAS.
  76. RollupConstApproveSignature = crypto.Keccak256([]byte("approve(address,uint256)"))
  77. // RollupConstERC20Signature ERC20 decimals signature
  78. RollupConstERC20Signature = crypto.Keccak256([]byte("decimals()"))
  79. )
  80. // RollupVerifierStruct is the information about verifiers of the Rollup Smart Contract
  81. type RollupVerifierStruct struct {
  82. MaxTx int64 `json:"maxTx"`
  83. NLevels int64 `json:"nlevels"`
  84. }
  85. // RollupConstants are the constants of the Rollup Smart Contract
  86. type RollupConstants struct {
  87. AbsoluteMaxL1L2BatchTimeout int64 `json:"absoluteMaxL1L2BatchTimeout"`
  88. TokenHEZ ethCommon.Address `json:"tokenHEZ"`
  89. Verifiers []RollupVerifierStruct `json:"verifiers"`
  90. HermezAuctionContract ethCommon.Address `json:"hermezAuctionContract"`
  91. HermezGovernanceAddress ethCommon.Address `json:"hermezGovernanceAddress"`
  92. WithdrawDelayerContract ethCommon.Address `json:"withdrawDelayerContract"`
  93. }
  94. // FindVerifierIdx tries to find a matching verifier in the RollupConstants and
  95. // returns its index
  96. func (c *RollupConstants) FindVerifierIdx(MaxTx, NLevels int64) (int, error) {
  97. for i, verifier := range c.Verifiers {
  98. if verifier.MaxTx == MaxTx && verifier.NLevels == NLevels {
  99. return i, nil
  100. }
  101. }
  102. return 0, tracerr.Wrap(fmt.Errorf("verifier not found for MaxTx: %v, NLevels: %v",
  103. MaxTx, NLevels))
  104. }
  105. // BucketParams are the parameter variables of each Bucket of Rollup Smart
  106. // Contract
  107. type BucketParams struct {
  108. CeilUSD *big.Int `json:"ceilUSD"`
  109. Withdrawals *big.Int `json:"withdrawals"`
  110. BlockWithdrawalRate *big.Int `json:"blockWithdrawalRate"`
  111. MaxWithdrawals *big.Int `json:"maxWithdrawals"`
  112. }
  113. // BucketUpdate are the bucket updates (tracking the withdrawals value changes)
  114. // in Rollup Smart Contract
  115. type BucketUpdate struct {
  116. EthBlockNum int64 `json:"ethereumBlockNum" meddler:"eth_block_num"`
  117. NumBucket int `json:"numBucket" meddler:"num_bucket"`
  118. BlockStamp int64 `json:"blockStamp" meddler:"block_stamp"`
  119. Withdrawals *big.Int `json:"withdrawals" meddler:"withdrawals,bigint"`
  120. }
  121. // TokenExchange are the exchange value for tokens registered in the Rollup
  122. // Smart Contract
  123. type TokenExchange struct {
  124. EthBlockNum int64 `json:"ethereumBlockNum" meddler:"eth_block_num"`
  125. Address ethCommon.Address `json:"address" meddler:"eth_addr"`
  126. ValueUSD int64 `json:"valueUSD" meddler:"value_usd"`
  127. }
  128. // RollupVariables are the variables of the Rollup Smart Contract
  129. type RollupVariables struct {
  130. EthBlockNum int64 `json:"ethereumBlockNum" meddler:"eth_block_num"`
  131. FeeAddToken *big.Int `json:"feeAddToken" meddler:"fee_add_token,bigint" validate:"required"`
  132. ForgeL1L2BatchTimeout int64 `json:"forgeL1L2BatchTimeout" meddler:"forge_l1_timeout" validate:"required"`
  133. WithdrawalDelay uint64 `json:"withdrawalDelay" meddler:"withdrawal_delay" validate:"required"`
  134. Buckets [RollupConstNumBuckets]BucketParams `json:"buckets" meddler:"buckets,json"`
  135. SafeMode bool `json:"safeMode" meddler:"safe_mode"`
  136. }
  137. // Copy returns a deep copy of the Variables
  138. func (v *RollupVariables) Copy() *RollupVariables {
  139. vCpy := *v
  140. return &vCpy
  141. }