Change-Id: I130ce4c6d04b6f56acdbaefff507c694e8bf8260
6.2 KiB
Layer 2 support for SNO payouts
Context
Recently, the real USD value of per-ERC20 transactions has skyrocketed, both in terms of GWEI per transaction, but also in terms of the price of ETH.
Like every cryptocurrency, Ethereum's community has been investigating approaches to scaling transactions, both in reducing cost and increasing throughput.
In the last year, zkRollup-based layer 2 scaling approaches have shown a great deal of promise. By using SNARKs (or PLONKs), zkRollup-based approaches are able to support >8000 TPS while still maintaining all of the security guarantees of the underlying layer 1. zkSync in particular is a great, usable example. It supports ERC20 tokens, user-driven layer 2 deposits and withdrawals via an API or a friendly web interface, and can even support initiating withdrawal to a contract address or other address not explicitly registered or usable via zkSync.
We're excited about zkRollup (and zkSync in particular) and want to start using it to dramatically lower transaction costs and improve user experience. With zkRollup, we may even eventually be able to consider more frequent payouts than once a month.
Because zkSync is early technology and still has a few rough edges, we don't want to force uncomfortable users to use it at this time, so we want to give SNOs the ability to opt in to new layer 2 options.
Current Payouts system
Our current payouts system has two major components, the satellite and the CSV-driven payouts pipeline.
The satellite is responsible for generating monthly reports we call compensation invoices, which are CSVs with the following fields:
period,node-id,node-created-at,node-disqualified,node-gracefulexit,node-wallet,
node-address,node-last-ip,codes,usage-at-rest,usage-get,usage-put,
usage-get-repair,usage-put-repair,usage-get-audit,comp-at-rest,comp-get,comp-put,
comp-get-repair,comp-put-repair,comp-get-audit,surge-percent,owed,held,disposed,
total-held,total-disposed,paid-ytd
We then pass this CSV to an internal set of tools called the accountant
which
are responsible for checking these nodes' IP and wallet addresses against export
restrictions and a few other things and ultimately transforming the above data
into a small, two column spreadsheet with just addresses and USD amounts we
should transfer.
addr,amnt
Once these payouts have been processed, we generate a CSV of receipts (links to settled transactions hashes) and reimport this data back into the satellite for that period.
For us to use a different solution than layer 1 transfers, we need to extend the above pipeline to:
- indicate which transactions should happen on layer 2
- indicate what type of receipt a receipt is
Design goals
- Whenever a SNO configures a wallet address, we want that SNO to be able to additionally flag what features that wallet address supports (initially, opt-in zkSync support, but potentially more in the future).
- The satellite should keep track of per-node wallet addresses along with what features the wallet supports.
- Two storage nodes that share the same wallet address will not necessarily have the same feature flags (we want to support a SNO choosing to experiment with zkSync on one node but not on another).
- Transaction references to completed payouts should indicate which technology was used with that transaction, so zkSync transactions can be displayed in the SNO dashboard differently than layer 1 transactions.
Implementation notes
- Matter Labs has already provided us with a tool that processes CSVs of the
form
addr,amnt
and will generate receipts in our format, so the actual integration with zkSync is already done for our pipeline. We only need to know when to use their tool vs ours. - Docker storage nodes currently configure wallet addresses with an environment variable. We should configure supported wallet technologies alongside this environment variable. For example: WALLET="0x..." WALLET_FEATURES="zksync,raiden" The storage node should confirm that the list of wallet features is a comma-separated list of strings.
- Windows configuration is obviously different. Each platform needs a way to have a user add support for some wallet features. We can start off with config file only and add UI features soon thereafter.
- This list of wallet features should be sent through the contact.NodeInfo struct to the Satellite, and should be stored on the Satellite in the nodes table.
- We want this column to be outputted per node during the generate-invoices subcommand of the compensation subcommand of the satellite, so "wallet-features" will need to be added to the invoices CSV.
- Our accountant pipeline currently aggregates all payments to a single
wallet address. We'll need to change our accountant pipeline to output
a different CSV per transaction method (zkSync vs normal layer 1). This
means that if a user has the same wallet on two nodes, but only one node
opts-in to zkSync, then that wallet will get two payouts, one with zkSync
and one without. We will only aggregate within a specific method.
In a scenario where an operator has three nodes, one with no wallet features,
one with the
zksync
wallet feature, and one with thezksync,raiden
wallet features, it will be up to theaccountant
tool to choose whether or not the third node gets a payout via Raiden or zkSync based on what we prefer. If theaccountant
tool preferszksync
overraiden
, then the operator will get two transactions: one layer 1, and one combinedzksync
payout. If theaccountant
tool prefersraiden
overzksync
, then that operator would get three transactions.
Future compatibility and plans
- We want zkSync to be opt-in for now, but we expect at some future point to be opt-out when zkSync and our community are ready.
- Even though zkSync is opt-in for now, we want it to be prominent, in that we want to encourage people to use it if they are willing.
- If at some point we decide we want to add a new wallet feature (e.g. "plasma"), we should not require storage node or satellite code changes to get that wallet feature indication out of the compensation CSV.