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.

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