mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-07 10:12:19 +00:00
fc40d603c0
Former-commit-id: e95f66b509da5b24054415c15642fd952728a193 [formerly 1f8c4e6ad036cddb162a5588696d44d648f7d5eb] Former-commit-id: 2897e7c38f227a4f8cd0456cb6fc904ecddeb71f
83 lines
2.6 KiB
Go
83 lines
2.6 KiB
Go
package sharding
|
|
|
|
import (
|
|
"fmt"
|
|
"math/big"
|
|
"reflect"
|
|
|
|
ethereum "github.com/ethereum/go-ethereum"
|
|
"github.com/ethereum/go-ethereum/accounts"
|
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
|
"github.com/ethereum/go-ethereum/sharding/contracts"
|
|
cli "gopkg.in/urfave/cli.v1"
|
|
)
|
|
|
|
// Node defines a a sharding-enabled Ethereum instance that provides
|
|
// full control and shared access of necessary components and services
|
|
// for a sharded Ethereum blockchain.
|
|
type Node interface {
|
|
Start() error
|
|
Close() error
|
|
Register(constructor ServiceConstructor) error
|
|
SMCClient() SMCClient
|
|
}
|
|
|
|
// SMCClient contains useful methods for a sharding node to interact with
|
|
// an Ethereum client running on the mainchain.
|
|
type SMCClient interface {
|
|
Account() *accounts.Account
|
|
CreateTXOpts(value *big.Int) (*bind.TransactOpts, error)
|
|
SMCCaller() *contracts.SMCCaller
|
|
SMCTransactor() *contracts.SMCTransactor
|
|
ChainReader() ethereum.ChainReader
|
|
DepositFlag() bool
|
|
SetDepositFlag(deposit bool)
|
|
DataDirFlag() string
|
|
Context() *cli.Context
|
|
}
|
|
|
|
// ShardP2P defines an interface for a peer-to-peer system in a
|
|
// sharded Ethereum blockchain.
|
|
type ShardP2P interface{}
|
|
|
|
// TXPool defines an interface for a transaction pool that handles
|
|
// incoming shard transactions in the network.
|
|
type TXPool interface{}
|
|
|
|
// Actor refers to either a notary, proposer, or observer.
|
|
type Actor interface {
|
|
Start() error
|
|
Stop() error
|
|
}
|
|
|
|
// ServiceContext is a collection of service independent options inherited from
|
|
// the protocol stack, that is passed to all constructors to be optionally used;
|
|
// as well as utility methods to operate on the service environment.
|
|
type ServiceContext struct {
|
|
services map[reflect.Type]Service // Index of the already constructed services
|
|
}
|
|
|
|
// ServiceConstructor is the function signature of the constructors needed to be
|
|
// registered for service instantiation.
|
|
type ServiceConstructor func(ctx *ServiceContext) (Service, error)
|
|
|
|
// Service is an individual protocol that can be registered into a node.
|
|
type Service interface {
|
|
// Start is called after all services have been constructed to
|
|
// spawn any goroutines required by the service.
|
|
Start() error
|
|
// Stop terminates all goroutines belonging to the service,
|
|
// blocking until they are all terminated.
|
|
Stop() error
|
|
}
|
|
|
|
// Service retrieves a currently running service registered of a specific type.
|
|
func (ctx *ServiceContext) Service(service interface{}) error {
|
|
element := reflect.ValueOf(service).Elem()
|
|
if running, ok := ctx.services[element.Type()]; ok {
|
|
element.Set(reflect.ValueOf(running))
|
|
return nil
|
|
}
|
|
return fmt.Errorf("unknown service")
|
|
}
|