# ETH 2.0 Interop Survey Response - Lodestar
### 1. General
- **1.1** What is the latest version of the specification which your client currently supports?
- **1.2** Is `v0.8.2+` targeted as interop version? If not, which version do you suggest?
- **1.3** Are any features or components particularly difficult to update, and on what versions are these currently?
- **1.4** In terms of interop, do you have any suggestions?
We may not have a performant enough client for interop. It will probably be useful for us to focus on specific aspects of interop at the lockin.
TODO: outdated now with latest BLS change?
- **1.5** What has been your primary bottleneck in development?
- **1.6** What do you anticipate to be the primary bottleneck in the future?
Focusing on the "right priorities", being spread thin on different development fronts: full client optimization, light clients, dev tooling polish
### 2. Networking Essentials
- **2.1** Does your client currently implement libp2p? If not, what subset is working?
- **2.2** Do you make use of a libp2p daemon approach?
- **2.3** How does your client become aware of its peers?
Static node list
- **2.4** By which process does your client establish a handshake with its peers?
req/resp hello messages
- **2.5** Which wire-level encryption methods does your client implement or support? Secio? TLS? Other? If your client supports multiple encryption methods, please indicate which ones.
- **2.6** Does your client conform to the specified wire protocol? If not, please provide a link to the appropriate code snippet or repo which defines these message types.
### 3. Syncing
- **3.1** Do you use the `/eth2/beacon_chain/req/beacon_blocks/1/` proposed in the [Network Spec](https://github.com/ethereum/eth2.0-specs/blob/dev/specs/networking/p2p-interface.md#beaconblocks) for syncing?
- **3.2** Do you support a full sync from genesis after the network is running for a longer period of time
- **3.3** Can you bootstrap syncing with a copy of sync data?
- **3.4** Do you make use of batch-requests for blocks? If so, what does your batched block request look like?
:x: we only batch the blocks in initial sync
- **3.5** Do you have any particular sync strategy? (Full sequential, skip-ahead, or some hybrid approach?)
- **3.6** Do you implement any pruning mechanism? (not necessary for initial interop)
### 4. State Storage
#### (_Out of interest, no hard requirements_)
- **4.1** Do you minimize storage? Are you supporting any of the following approaches?
1. Immutable state data structure
2. Segmented/chunkfied state
3. Full copies :heavy_check_mark:
- **4.2** What is your storage approach like?
1. Store on X interval
2. Store every slot
3. Store every block :heavy_check_mark:
### 5. Attestation Aggregation
- **5.1** Do you follow the current [basic interop aggregate strategy](https://github.com/ethereum/eth2.0-specs/blob/dev/specs/networking/p2p-interface.md#interop-3)? (parse anything, but publish just minimal what you have to aggregate later).
- **5.2** Do you support alternative (more advanced) aggregation strategies?
### 6. Fork Choice
- **6.1** Do you test fork choice? In what kind of context(s) do you test it?
Not really, we have unit tests that verify the lmd ghost functionality
- **6.2** What is your implementation type like:
- Unoptimized spec
- Cached spec-like
- Reduced form (shortcut 1-child nodes)
- Stateful structure :heavy_check_mark:
### 7. Spec-Tests / Transition Consensus
- **7.1** Do you pass the following spec tests? If not, in which configuration and what tests?:
We are passing all spec tests in both configurations.
- Block operations :heavy_check_mark:
- Epoch processing :heavy_check_mark:
- Sanity tests :heavy_check_mark:
- BLS integration :heavy_check_mark:
- SSZ_static :heavy_check_mark:
- Shuffling :heavy_check_mark:
- **7.2** What spec version are you currently targetting for tests?
We are running tests on 0.8.1 spec version but we are in process on migrating to new 0.8.2 spec tests.
### 8. Block Propagation (Strategy)
- **8.1** Do you follow the network spec: verify the proposer signature before relaying a block?
Should be ready for interop
- **8.2** And if so, do you transition state completely, or just enough to know the proposer index?
We transition the state completely.
- **8.3** Do you use any different approaches, like:
- **8.3.1** Do you at any time randomly (or always) relay blocks without verification of the signature?
- **8.3.2** Which blocks do you process first (i.e. what gets priority)?
First come first served.
- **8.3.3** Do you detect spam? (i.e. drop peers with high amounts of invalid blocks)
We save block root of invalid blocks and skip them if they are received repeatedly.
- **8.3.4** Is there any security check for double voting on the same block height before propagation?
### 9. Attestation Propagation (strategy)
- **9.1** Do you follow the [network spec](https://github.com/ethereum/eth2.0-specs/blob/dev/specs/networking/p2p-interface.md#topics): verify a voted-for block fully before relaying an attestation? (option 1), or do you take another approach, such as relaying first, or with certain peers only?
### 10. Block Proposals
- **10.1** Do you fill grafitti with any debug data?
- What do you think of thus grafitti debug format proposal, described [here](https://notes.ethereum.org/VpUNqtrgRvqogY38bmKWpA)?
- **10.2** Do you implement the latest [Validator API](https://github.com/ethereum/eth2.0-specs/blob/dev/specs/validator/0_beacon-node-validator-api.md)?
Working according to spec
- **10.3** What is your clock syncing approach?
rely on system clock
### 11. Monitoring
- **11.1** Do you implement the [proposed Metrics](https://github.com/ethereum/eth2.0-metrics/blob/master/metrics.md)
- **11.2** Do you provide a API endpoint for:
- Sync status :x:
- Current chain head (from node perspective) :heavy_check_mark:
- A series of blocks :x:
- **11.3** What do you use for logging? (e.g. custom JSON, library XYZ)
custom text, [winston logger](https://github.com/winstonjs/winston)
- **11.4** Provide links to any misc. API implemented by the beacon node.
### 12. Keystore
- **12.1** Do you use anything like the Eth1 keystore format?
We use extact eth1 keystore format.
- **12.2** Do you see any problems with the [latest proposed keystore format](https://github.com/ethereum/eth2.0-specs/pull/1361), for interop purposes specifically?
### 13. SSZ
- **13.1** Do you have SSZ v0.8 (hash-tree-roots with stable depth, bitlists/vectors) implemented currently?
- **13.2** Do you experience any particular delays with hash-tree-root? (If not already for the minimal configuration, does it apply to mainnet state sizes for your ssz implementation?
### 14. BLS
- **14.1** Do tests pass for version v0.8.2+ (little endian domain bytes)
It passes 0.8.1 and it will probably pass 0.8.2 as we are already using bytes and not uint for domain.
- **14.2** What BLS library do you use? (provide link)
forked milagro js - https://github.com/ChainSafe/incubator-milagro-crypto-js
- **14.3** Do you implement a BLS wrapper? (provide link)
- **14.4** Do you have a benchmark of verify-aggregate bench speed of 128 participants, same message being signed. Called from client.
### 15. Chain Start ([reference doc](https://github.com/ethereum/eth2.0-pm/issues/60))
- **15.1** Do you support loading:
1. A kickstart (plain `(genesis_time, validator_count)` tuple) :heavy_check_mark:
2. A list of deposits, with incremental proofs (genesis spec) :x:
3. A list of deposits, with proofs all to the same deposit root. :x:
4. A series of deposit contract logs from an Eth 1.0 oracle, from a mock/test service :heavy_check_mark:
5. A series of deposit contract logs from a real Eth 1.0 node? :heavy_check_mark:
6. A genesis constructed from a (slow and long) stream of deposit log events? :?: (Should work)?
7. A plain prepared genesis BeaconState object from SSZ? :heavy_check_mark:
- **15.2** For testing genesis, do you generate keys in advance? And/or in a predictable reproducible manner for debugging?
We generate them from mnemonic.
### 16. Configuration & Performance
- **16.1** Do you meet minimal configuration in respect to processing performance; 6 seconds with 8-slot epochs? :heavy_check_mark:
- **16.2** Are there alternative variations / easier parameters that work particularly well for your testnet(s)? :x:
- **16.3** Do you load configuration on compile-time or run-time?
### 17. Building & deploying
- **17.1** Do you provide a build script for the client?
- **17.2** Do you use a form of containerization? E.g. Docker?
untested docker image
- **17.3** Have you automated testnet deployments?
- **17.4** What platforms/architectures are supported?
linux, macos, windows
### 18. Conclusion
- **18.1** Is there anything that this questionnaire did not cover?
- **18.2** Any miscellaneous suggestions?
- **18.3** Are there any bottlenecks into which we may not currently have visibility?
naive implementation, slow code, brittle cli
- **18.4** What can we do to provide you with adequate support? In otherwords, *how can we make your life easier*?
list optimizations, create "slow network" configuration
- **18.5** In terms of tooling, what are we currently lacking?