Skip to content

Commit b420b5e

Browse files
committed
les, eth, core, cmd, mobile: add ulc mode
1 parent 201a0bf commit b420b5e

23 files changed

+1280
-164
lines changed

cmd/geth/config.go

+1
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) {
124124
}
125125

126126
// Apply flags.
127+
utils.SetULC(ctx, &cfg.Eth)
127128
utils.SetNodeConfig(ctx, &cfg.Node)
128129
stack, err := node.New(&cfg.Node)
129130
if err != nil {

cmd/geth/main.go

+4
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ var (
8282
utils.TxPoolAccountQueueFlag,
8383
utils.TxPoolGlobalQueueFlag,
8484
utils.TxPoolLifetimeFlag,
85+
utils.ULCModeConfigFlag,
86+
utils.OnlyAnnounceModeFlag,
87+
utils.ULCTrustedNodesFlag,
88+
utils.ULCMinTrustedFractionFlag,
8589
utils.SyncModeFlag,
8690
utils.GCModeFlag,
8791
utils.LightServFlag,

cmd/utils/flags.go

+55
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package utils
1919

2020
import (
2121
"crypto/ecdsa"
22+
"encoding/json"
2223
"fmt"
2324
"io/ioutil"
2425
"math/big"
@@ -157,6 +158,23 @@ var (
157158
Usage: "Document Root for HTTPClient file scheme",
158159
Value: DirectoryString{homeDir()},
159160
}
161+
ULCModeConfigFlag = cli.StringFlag{
162+
Name: "ulc.config",
163+
Usage: "Config file to use for ultra light client mode",
164+
}
165+
OnlyAnnounceModeFlag = cli.BoolFlag{
166+
Name: "ulc.onlyannounce",
167+
Usage: "ULC server sends announcements only",
168+
}
169+
ULCMinTrustedFractionFlag = cli.IntFlag{
170+
Name: "ulc.fraction",
171+
Usage: "Minimum % of trusted ULC servers required to announce a new head",
172+
}
173+
ULCTrustedNodesFlag = cli.StringFlag{
174+
Name: "ulc.trusted",
175+
Usage: "List of trusted ULC servers",
176+
}
177+
160178
defaultSyncMode = eth.DefaultConfig.SyncMode
161179
SyncModeFlag = TextMarshalerFlag{
162180
Name: "syncmode",
@@ -816,6 +834,40 @@ func setIPC(ctx *cli.Context, cfg *node.Config) {
816834
}
817835
}
818836

837+
// SetULC setup ULC config from file if given.
838+
func SetULC(ctx *cli.Context, cfg *eth.Config) {
839+
// ULC config isn't loaded from global config and ULC config and ULC trusted nodes are not defined.
840+
if cfg.ULC == nil && !(ctx.GlobalIsSet(ULCModeConfigFlag.Name) || ctx.GlobalIsSet(ULCTrustedNodesFlag.Name)) {
841+
return
842+
}
843+
cfg.ULC = &eth.ULCConfig{}
844+
845+
path := ctx.GlobalString(ULCModeConfigFlag.Name)
846+
if path != "" {
847+
cfgData, err := ioutil.ReadFile(path)
848+
if err != nil {
849+
Fatalf("Failed to unmarshal ULC configuration: %v", err)
850+
}
851+
852+
err = json.Unmarshal(cfgData, &cfg.ULC)
853+
if err != nil {
854+
Fatalf("Failed to unmarshal ULC configuration: %s", err.Error())
855+
}
856+
}
857+
858+
if trustedNodes := ctx.GlobalString(ULCTrustedNodesFlag.Name); trustedNodes != "" {
859+
cfg.ULC.TrustedServers = strings.Split(trustedNodes, ",")
860+
}
861+
862+
if trustedFraction := ctx.GlobalInt(ULCMinTrustedFractionFlag.Name); trustedFraction > 0 {
863+
cfg.ULC.MinTrustedFraction = trustedFraction
864+
}
865+
if cfg.ULC.MinTrustedFraction <= 0 && cfg.ULC.MinTrustedFraction > 100 {
866+
log.Error("MinTrustedFraction is invalid", "MinTrustedFraction", cfg.ULC.MinTrustedFraction, "Changed to default", eth.DefaultULCMinTrustedFraction)
867+
cfg.ULC.MinTrustedFraction = eth.DefaultULCMinTrustedFraction
868+
}
869+
}
870+
819871
// makeDatabaseHandles raises out the number of allowed file handles per process
820872
// for Geth and returns half of the allowance to assign to the database.
821873
func makeDatabaseHandles() int {
@@ -1143,6 +1195,9 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) {
11431195
if ctx.GlobalIsSet(LightPeersFlag.Name) {
11441196
cfg.LightPeers = ctx.GlobalInt(LightPeersFlag.Name)
11451197
}
1198+
if ctx.GlobalIsSet(OnlyAnnounceModeFlag.Name) {
1199+
cfg.OnlyAnnounce = ctx.GlobalBool(OnlyAnnounceModeFlag.Name)
1200+
}
11461201
if ctx.GlobalIsSet(NetworkIdFlag.Name) {
11471202
cfg.NetworkId = ctx.GlobalUint64(NetworkIdFlag.Name)
11481203
}

core/headerchain.go

+10-6
Original file line numberDiff line numberDiff line change
@@ -219,14 +219,18 @@ func (hc *HeaderChain) ValidateHeaderChain(chain []*types.Header, checkFreq int)
219219

220220
// Generate the list of seal verification requests, and start the parallel verifier
221221
seals := make([]bool, len(chain))
222-
for i := 0; i < len(seals)/checkFreq; i++ {
223-
index := i*checkFreq + hc.rand.Intn(checkFreq)
224-
if index >= len(seals) {
225-
index = len(seals) - 1
222+
if checkFreq != 0 {
223+
// In case of checkFreq == 0 all seals are left false.
224+
for i := 0; i < len(seals)/checkFreq; i++ {
225+
index := i*checkFreq + hc.rand.Intn(checkFreq)
226+
if index >= len(seals) {
227+
index = len(seals) - 1
228+
}
229+
seals[index] = true
226230
}
227-
seals[index] = true
231+
// Last should always be verified to avoid junk.
232+
seals[len(seals)-1] = true
228233
}
229-
seals[len(seals)-1] = true // Last should always be verified to avoid junk
230234

231235
abort, results := hc.engine.VerifyHeaders(hc, chain, seals)
232236
defer close(abort)

eth/config.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,12 @@ type Config struct {
8787
NoPruning bool
8888

8989
// Light client options
90-
LightServ int `toml:",omitempty"` // Maximum percentage of time allowed for serving LES requests
91-
LightPeers int `toml:",omitempty"` // Maximum number of LES client peers
90+
LightServ int `toml:",omitempty"` // Maximum percentage of time allowed for serving LES requests
91+
LightPeers int `toml:",omitempty"` // Maximum number of LES client peers
92+
OnlyAnnounce bool // Maximum number of LES client peers
93+
94+
// Ultra Light client options
95+
ULC *ULCConfig `toml:",omitempty"`
9296

9397
// Database options
9498
SkipBcVersionCheck bool `toml:"-"`

eth/gen_config.go

+21-8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

eth/ulc_config.go

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package eth
2+
3+
const DefaultULCMinTrustedFraction = 75
4+
5+
// ULCConfig is a Ultra Light client options.
6+
type ULCConfig struct {
7+
TrustedServers []string `toml:",omitempty"` // A list of trusted servers
8+
MinTrustedFraction int `toml:",omitempty"` // Minimum percentage of connected trusted servers to validate trusted (1-100)
9+
}

les/backend.go

+29-2
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,12 @@ func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) {
109109
bloomIndexer: eth.NewBloomIndexer(chainDb, params.BloomBitsBlocksClient, params.HelperTrieConfirmations),
110110
}
111111

112+
var trustedNodes []string
113+
if leth.config.ULC != nil {
114+
trustedNodes = leth.config.ULC.TrustedServers
115+
}
112116
leth.relay = NewLesTxRelay(peers, leth.reqDist)
113-
leth.serverPool = newServerPool(chainDb, quitSync, &leth.wg)
117+
leth.serverPool = newServerPool(chainDb, quitSync, &leth.wg, trustedNodes)
114118
leth.retriever = newRetrieveManager(peers, leth.reqDist, leth.serverPool)
115119

116120
leth.odr = NewLesOdr(chainDb, light.DefaultClientIndexerConfig, leth.retriever)
@@ -136,10 +140,33 @@ func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) {
136140
}
137141

138142
leth.txPool = light.NewTxPool(leth.chainConfig, leth.blockchain, leth.relay)
139-
if leth.protocolManager, err = NewProtocolManager(leth.chainConfig, light.DefaultClientIndexerConfig, true, config.NetworkId, leth.eventMux, leth.engine, leth.peers, leth.blockchain, nil, chainDb, leth.odr, leth.relay, leth.serverPool, quitSync, &leth.wg); err != nil {
143+
144+
if leth.protocolManager, err = NewProtocolManager(
145+
leth.chainConfig,
146+
light.DefaultClientIndexerConfig,
147+
true,
148+
config.NetworkId,
149+
leth.eventMux,
150+
leth.engine,
151+
leth.peers,
152+
leth.blockchain,
153+
nil,
154+
chainDb,
155+
leth.odr,
156+
leth.relay,
157+
leth.serverPool,
158+
quitSync,
159+
&leth.wg,
160+
config.ULC); err != nil {
140161
return nil, err
141162
}
163+
164+
if leth.protocolManager.isULCEnabled() {
165+
log.Warn("Ultra light client is enabled", "trustedNodes", len(leth.protocolManager.ulc.trustedKeys), "minTrustedFraction", leth.protocolManager.ulc.minTrustedFraction)
166+
leth.blockchain.DisableCheckFreq()
167+
}
142168
leth.ApiBackend = &LesApiBackend{leth, nil}
169+
143170
gpoParams := config.GPO
144171
if gpoParams.Default == nil {
145172
gpoParams.Default = config.MinerGasPrice

0 commit comments

Comments
 (0)