This section explains how the Lantern.Beacon library can be integrated into a C# project.
Setting Up
To setup the library, the configuration settings for the Discv5 protocol must first be created:
// Must provide an array of Ethereum Node Records (ENRs) in string format.// These are required for finding the relevant nodes. var bootstrapEnrs =new[]{"enr:-Ku4QImhMc1z8yC...",};// Configurable settings used by the Discovery protocol.var tableOptions =newTableOptions(bootstrapEnrs);var connectionOptions =newConnectionOptions();var sessionOptions =SessionOptions.Default;// Create an instance of ENR (Ethereum Node Record).// Must provide the 'v4' identity scheme and Secp256k1 public key as entries.var enr =newEnrBuilder() .WithIdentityScheme(sessionOptions.Verifier,sessionOptions.Signer) .WithEntry(EnrEntryKey.Id,newEntryId("v4")) .WithEntry(EnrEntryKey.Secp256K1,newEntrySecp256K1(sessionOptions.Signer.PublicKey));// Create a logger factory for the discovery protocol.// Below's example sets the log level to none, however, if needed, other levels can be used.var discv5LoggerFactory =LoggerFactory.Create(builder =>builder.SetMinimumLevel(LogLevel.None));
Next, the configuration settings need to be created for the Beacon client:
// The following settings must be provided for sync protocol.// The trusted block root can be retrieved from any Ethereum explorer.var syncProtocolOptions =newSyncProtocolOptions(){ Preset =SizePreset.MainnetPreset, GenesisTime =1606824023, GenesisValidatorsRoot =Convert.FromHexString("4b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe95"), TrustedBlockRoot =Convert.FromHexString("9344d07abccaa481cb301e804c99d9b3102fb70c0d950354c8d22f6f0f389ef2"), Network =NetworkType.Mainnet;};// Configurable options for the beacon client.// Note that providing bootnodes is optional for beacon client options.var beaconClientOptions =newBeaconClientOptions(){ TcpPort =9005, Bootnodes = ["/ip4/135.148.103.80/tcp/9000/p2p/16Uiu2HAm1iCnKSNGhee2RKa1EYbazz4JJ8CDVVCPLyXS9PFYPG1A"]};// Create a logger factory for the Beacon client.// Below is an example that can be used.var loggerFactory =LoggerFactory.Create(builder =>{ builder .SetMinimumLevel(LogLevel.Information) .AddSimpleConsole(l => {l.SingleLine=true;l.TimestampFormat="[HH:mm:ss] ";l.ColorBehavior=LoggerColorBehavior.Default;l.IncludeScopes=false;l.UseUtcTimestamp=true; });});
Lastly, the configurations that have been setup in the previous steps must be added to ServiceCollection:
// Create a new instance of service collectionvar services =newServiceCollection();// Add the configurations to the service collectionservices.AddBeaconClient(beaconClientBuilder =>{beaconClientBuilder.AddDiscoveryProtocol(discv5Builder => {discv5Builder.WithConnectionOptions(connectionOptions) .WithTableOptions(tableOptions) .WithEnrBuilder(enr) .WithSessionOptions(sessionOptions) .WithLoggerFactory(discv5LoggerFactory); });beaconClientBuilder.WithBeaconClientOptions(beaconClientOptions);beaconClientBuilder.WithSyncProtocolOptions(syncProtocolOptions);beaconClientBuilder.AddLibp2pProtocol(libp2pBuilder => libp2pBuilder);beaconClientBuilder.WithLoggerFactory(loggerFactory);});
Now that all the required steps have been completed for setting up the Beacon client, the service for it can be created:
var serviceProvider =services.BuildServiceProvider();var beaconClient =serviceProvider.GetRequiredService<IBeaconClient>();
How To Use
For running the beacon client, it is first necessary to call the InitAsync method in an async manner:
awaitbeaconClient.InitAsync();
This will initialize the necessary dependencies for the client to run correctly. This function must be called and awaited before starting the beacon client.