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.

157 lines
7.8 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.
4 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. // [5 bytes] depositAmountFloat40 + [5 bytes] amountFloat40 + [4 bytes] tokenId + [6 bytes] toIdx
  25. RollupConstL1UserTotalBytes = 78
  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. )
  41. var (
  42. // RollupConstLimitDepositAmount Max deposit amount allowed (depositAmount: L1 --> L2)
  43. RollupConstLimitDepositAmount, _ = new(big.Int).SetString("340282366920938463463374607431768211456", 10)
  44. // RollupConstLimitL2TransferAmount Max amount allowed (amount L2 --> L2)
  45. RollupConstLimitL2TransferAmount, _ = new(big.Int).SetString("6277101735386680763835789423207666416102355444464034512896", 10)
  46. // RollupConstEthAddressInternalOnly This ethereum address is used internally for rollup accounts that don't have ethereum address, only Babyjubjub
  47. // This non-ethereum accounts can be created by the coordinator and allow users to have a rollup
  48. // account without needing an ethereum address
  49. RollupConstEthAddressInternalOnly = ethCommon.HexToAddress("0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF")
  50. // RollupConstRfield Modulus zkSNARK
  51. RollupConstRfield, _ = new(big.Int).SetString(
  52. "21888242871839275222246405745257275088548364400416034343698204186575808495617", 10)
  53. // RollupConstERC1820 ERC1820Registry address
  54. RollupConstERC1820 = ethCommon.HexToAddress("0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24")
  55. // ERC777 tokens signatures
  56. // RollupConstRecipientInterfaceHash ERC777 recipient interface hash
  57. RollupConstRecipientInterfaceHash = crypto.Keccak256([]byte("ERC777TokensRecipient"))
  58. // RollupConstPerformL1UserTxSignature the signature of the function that can be called thru an ERC777 `send`
  59. RollupConstPerformL1UserTxSignature = crypto.Keccak256([]byte("addL1Transaction(uint256,uint48,uint16,uint16,uint32,uint48)"))
  60. // RollupConstAddTokenSignature the signature of the function that can be called thru an ERC777 `send`
  61. RollupConstAddTokenSignature = crypto.Keccak256([]byte("addToken(address)"))
  62. // RollupConstSendSignature ERC777 Signature
  63. RollupConstSendSignature = crypto.Keccak256([]byte("send(address,uint256,bytes)"))
  64. // RollupConstERC777Granularity ERC777 Signature
  65. RollupConstERC777Granularity = crypto.Keccak256([]byte("granularity()"))
  66. // RollupConstWithdrawalDelayerDeposit This constant are used to deposit tokens from ERC77 tokens into withdrawal delayer
  67. RollupConstWithdrawalDelayerDeposit = crypto.Keccak256([]byte("deposit(address,address,uint192)"))
  68. // ERC20 signature
  69. // RollupConstTransferSignature This constant is used in the _safeTransfer internal method in order to safe GAS.
  70. RollupConstTransferSignature = crypto.Keccak256([]byte("transfer(address,uint256)"))
  71. // RollupConstTransferFromSignature This constant is used in the _safeTransfer internal method in order to safe GAS.
  72. RollupConstTransferFromSignature = crypto.Keccak256([]byte("transferFrom(address,address,uint256)"))
  73. // RollupConstApproveSignature This constant is used in the _safeTransfer internal method in order to safe GAS.
  74. RollupConstApproveSignature = crypto.Keccak256([]byte("approve(address,uint256)"))
  75. // RollupConstERC20Signature ERC20 decimals signature
  76. RollupConstERC20Signature = crypto.Keccak256([]byte("decimals()"))
  77. )
  78. // RollupVerifierStruct is the information about verifiers of the Rollup Smart Contract
  79. type RollupVerifierStruct struct {
  80. MaxTx int64 `json:"maxTx"`
  81. NLevels int64 `json:"nlevels"`
  82. }
  83. // RollupConstants are the constants of the Rollup Smart Contract
  84. type RollupConstants struct {
  85. AbsoluteMaxL1L2BatchTimeout int64 `json:"absoluteMaxL1L2BatchTimeout"`
  86. TokenHEZ ethCommon.Address `json:"tokenHEZ"`
  87. Verifiers []RollupVerifierStruct `json:"verifiers"`
  88. HermezAuctionContract ethCommon.Address `json:"hermezAuctionContract"`
  89. HermezGovernanceAddress ethCommon.Address `json:"hermezGovernanceAddress"`
  90. WithdrawDelayerContract ethCommon.Address `json:"withdrawDelayerContract"`
  91. }
  92. // FindVerifierIdx tries to find a matching verifier in the RollupConstants and
  93. // returns its index
  94. func (c *RollupConstants) FindVerifierIdx(MaxTx, NLevels int64) (int, error) {
  95. for i, verifier := range c.Verifiers {
  96. if verifier.MaxTx == MaxTx && verifier.NLevels == NLevels {
  97. return i, nil
  98. }
  99. }
  100. return 0, tracerr.Wrap(fmt.Errorf("verifier not found for MaxTx: %v, NLevels: %v",
  101. MaxTx, NLevels))
  102. }
  103. // BucketParams are the parameter variables of each Bucket of Rollup Smart
  104. // Contract
  105. type BucketParams struct {
  106. CeilUSD *big.Int
  107. Withdrawals *big.Int
  108. BlockWithdrawalRate *big.Int
  109. MaxWithdrawals *big.Int
  110. }
  111. // BucketUpdate are the bucket updates (tracking the withdrawals value changes)
  112. // in Rollup Smart Contract
  113. type BucketUpdate struct {
  114. EthBlockNum int64 `meddler:"eth_block_num"`
  115. NumBucket int `meddler:"num_bucket"`
  116. BlockStamp int64 `meddler:"block_stamp"`
  117. Withdrawals *big.Int `meddler:"withdrawals,bigint"`
  118. }
  119. // TokenExchange are the exchange value for tokens registered in the Rollup
  120. // Smart Contract
  121. type TokenExchange struct {
  122. EthBlockNum int64 `json:"ethereumBlockNum" meddler:"eth_block_num"`
  123. Address ethCommon.Address `json:"address" meddler:"eth_addr"`
  124. ValueUSD int64 `json:"valueUSD" meddler:"value_usd"`
  125. }
  126. // RollupVariables are the variables of the Rollup Smart Contract
  127. type RollupVariables struct {
  128. EthBlockNum int64 `meddler:"eth_block_num"`
  129. FeeAddToken *big.Int `meddler:"fee_add_token,bigint" validate:"required"`
  130. ForgeL1L2BatchTimeout int64 `meddler:"forge_l1_timeout" validate:"required"`
  131. WithdrawalDelay uint64 `meddler:"withdrawal_delay" validate:"required"`
  132. Buckets [RollupConstNumBuckets]BucketParams `meddler:"buckets,json"`
  133. SafeMode bool `meddler:"safe_mode"`
  134. }
  135. // Copy returns a deep copy of the Variables
  136. func (v *RollupVariables) Copy() *RollupVariables {
  137. vCpy := *v
  138. return &vCpy
  139. }