Skip to content

Commit b58a501

Browse files
committed
whisperv5: integrate whisper and add whisper RPC simulator
1 parent 80f7c6c commit b58a501

27 files changed

+1280
-524
lines changed

cmd/geth/config.go

+28-7
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"github.com/ethereum/go-ethereum/eth"
3434
"github.com/ethereum/go-ethereum/node"
3535
"github.com/ethereum/go-ethereum/params"
36+
whisper "github.com/ethereum/go-ethereum/whisper/whisperv5"
3637
"github.com/naoina/toml"
3738
)
3839

@@ -42,7 +43,7 @@ var (
4243
Name: "dumpconfig",
4344
Usage: "Show configuration values",
4445
ArgsUsage: "",
45-
Flags: append(nodeFlags, rpcFlags...),
46+
Flags: append(append(nodeFlags, rpcFlags...), whisper.Flags...),
4647
Category: "MISCELLANEOUS COMMANDS",
4748
Description: `The dumpconfig command shows configuration values.`,
4849
}
@@ -76,6 +77,7 @@ type ethstatsConfig struct {
7677

7778
type gethConfig struct {
7879
Eth eth.Config
80+
Shh whisper.Config
7981
Node node.Config
8082
Ethstats ethstatsConfig
8183
}
@@ -99,8 +101,8 @@ func defaultNodeConfig() node.Config {
99101
cfg := node.DefaultConfig
100102
cfg.Name = clientIdentifier
101103
cfg.Version = params.VersionWithCommit(gitCommit)
102-
cfg.HTTPModules = append(cfg.HTTPModules, "eth")
103-
cfg.WSModules = append(cfg.WSModules, "eth")
104+
cfg.HTTPModules = append(cfg.HTTPModules, "eth", "shh")
105+
cfg.WSModules = append(cfg.WSModules, "eth", "shh")
104106
cfg.IPCPath = "geth.ipc"
105107
return cfg
106108
}
@@ -109,6 +111,7 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) {
109111
// Load defaults.
110112
cfg := gethConfig{
111113
Eth: eth.DefaultConfig,
114+
Shh: whisper.DefaultConfig,
112115
Node: defaultNodeConfig(),
113116
}
114117

@@ -130,19 +133,37 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) {
130133
cfg.Ethstats.URL = ctx.GlobalString(utils.EthStatsURLFlag.Name)
131134
}
132135

136+
utils.SetShhConfig(ctx, stack, &cfg.Shh)
137+
133138
return stack, cfg
134139
}
135140

141+
// enableWhisper returns true in case one of the whisper flags is set.
142+
func enableWhisper(ctx *cli.Context) bool {
143+
for _, flag := range whisper.Flags {
144+
if ctx.GlobalIsSet(flag.GetName()) {
145+
return true
146+
}
147+
}
148+
return false
149+
}
150+
136151
func makeFullNode(ctx *cli.Context) *node.Node {
137152
stack, cfg := makeConfigNode(ctx)
138153

139154
utils.RegisterEthService(stack, &cfg.Eth)
140155

141-
// Whisper must be explicitly enabled, but is auto-enabled in --dev mode.
142-
shhEnabled := ctx.GlobalBool(utils.WhisperEnabledFlag.Name)
143-
shhAutoEnabled := !ctx.GlobalIsSet(utils.WhisperEnabledFlag.Name) && ctx.GlobalIsSet(utils.DevModeFlag.Name)
156+
// Whisper must be explicitly enabled by specifying at least 1 whisper flag or in dev mode
157+
shhEnabled := enableWhisper(ctx)
158+
shhAutoEnabled := !ctx.GlobalIsSet(whisper.WhisperEnabledFlag.Name) && ctx.GlobalIsSet(utils.DevModeFlag.Name)
144159
if shhEnabled || shhAutoEnabled {
145-
utils.RegisterShhService(stack)
160+
if ctx.GlobalIsSet(whisper.MaxMessageSizeFlag.Name) {
161+
cfg.Shh.MaxMessageSize = uint32(ctx.Int(whisper.MaxMessageSizeFlag.Name))
162+
}
163+
if ctx.GlobalIsSet(whisper.MinPOWFlag.Name) {
164+
cfg.Shh.MinimumAcceptedPOW = ctx.Float64(whisper.MinPOWFlag.Name)
165+
}
166+
utils.RegisterShhService(stack, &cfg.Shh)
146167
}
147168

148169
// Add the Ethereum Stats daemon if requested.

cmd/geth/main.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"github.com/ethereum/go-ethereum/log"
3636
"github.com/ethereum/go-ethereum/metrics"
3737
"github.com/ethereum/go-ethereum/node"
38+
whisper "github.com/ethereum/go-ethereum/whisper/whisperv5"
3839
"gopkg.in/urfave/cli.v1"
3940
)
4041

@@ -95,7 +96,6 @@ var (
9596
utils.NetrestrictFlag,
9697
utils.NodeKeyFileFlag,
9798
utils.NodeKeyHexFlag,
98-
utils.WhisperEnabledFlag,
9999
utils.DevModeFlag,
100100
utils.TestnetFlag,
101101
utils.RinkebyFlag,
@@ -161,6 +161,7 @@ func init() {
161161
app.Flags = append(app.Flags, rpcFlags...)
162162
app.Flags = append(app.Flags, consoleFlags...)
163163
app.Flags = append(app.Flags, debug.Flags...)
164+
app.Flags = append(app.Flags, whisper.Flags...)
164165

165166
app.Before = func(ctx *cli.Context) error {
166167
runtime.GOMAXPROCS(runtime.NumCPU())

cmd/geth/usage.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424

2525
"github.com/ethereum/go-ethereum/cmd/utils"
2626
"github.com/ethereum/go-ethereum/internal/debug"
27+
"github.com/ethereum/go-ethereum/whisper/whisperv5"
2728
"gopkg.in/urfave/cli.v1"
2829
)
2930

@@ -187,6 +188,10 @@ var AppHelpFlagGroups = []flagGroup{
187188
utils.NoCompactionFlag,
188189
}, debug.Flags...),
189190
},
191+
{
192+
Name: "Whisper (EXPERIMENTAL)",
193+
Flags: whisperv5.Flags,
194+
},
190195
{
191196
Name: "DEPRECATED",
192197
Flags: []cli.Flag{
@@ -195,10 +200,7 @@ var AppHelpFlagGroups = []flagGroup{
195200
},
196201
},
197202
{
198-
Name: "EXPERIMENTAL",
199-
Flags: []cli.Flag{
200-
utils.WhisperEnabledFlag,
201-
},
203+
Name: "MISC",
202204
},
203205
}
204206

cmd/utils/flags.go

+14-7
Original file line numberDiff line numberDiff line change
@@ -440,11 +440,6 @@ var (
440440
Usage: "Restricts network communication to the given IP networks (CIDR masks)",
441441
}
442442

443-
WhisperEnabledFlag = cli.BoolFlag{
444-
Name: "shh",
445-
Usage: "Enable Whisper",
446-
}
447-
448443
// ATM the url is left to the user and deployment to
449444
JSpathFlag = cli.StringFlag{
450445
Name: "jspath",
@@ -878,6 +873,16 @@ func checkExclusive(ctx *cli.Context, flags ...cli.Flag) {
878873
}
879874
}
880875

876+
// SetShhConfig applies shh-related command line flags to the config.
877+
func SetShhConfig(ctx *cli.Context, stack *node.Node, cfg *whisper.Config) {
878+
if ctx.GlobalIsSet(whisper.MaxMessageSizeFlag.Name) {
879+
cfg.MaxMessageSize = uint32(ctx.GlobalUint(whisper.MaxMessageSizeFlag.Name))
880+
}
881+
if ctx.GlobalIsSet(whisper.MinPOWFlag.Name) {
882+
cfg.MinimumAcceptedPOW = ctx.GlobalFloat64(whisper.MinPOWFlag.Name)
883+
}
884+
}
885+
881886
// SetEthConfig applies eth-related command line flags to the config.
882887
func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) {
883888
// Avoid conflicting network flags
@@ -983,8 +988,10 @@ func RegisterEthService(stack *node.Node, cfg *eth.Config) {
983988
}
984989

985990
// RegisterShhService configures Whisper and adds it to the given node.
986-
func RegisterShhService(stack *node.Node) {
987-
if err := stack.Register(func(*node.ServiceContext) (node.Service, error) { return whisper.New(), nil }); err != nil {
991+
func RegisterShhService(stack *node.Node, cfg *whisper.Config) {
992+
if err := stack.Register(func(n *node.ServiceContext) (node.Service, error) {
993+
return whisper.New(cfg), nil
994+
}); err != nil {
988995
Fatalf("Failed to register the Whisper service: %v", err)
989996
}
990997
}

cmd/wnode/main.go

+11-5
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ var (
8787
argVerbosity = flag.Int("verbosity", int(log.LvlError), "log verbosity level")
8888
argTTL = flag.Uint("ttl", 30, "time-to-live for messages in seconds")
8989
argWorkTime = flag.Uint("work", 5, "work time in seconds")
90-
argMaxSize = flag.Int("maxsize", whisper.DefaultMaxMessageLength, "max size of message")
90+
argMaxSize = flag.Uint("maxsize", uint(whisper.DefaultMaxMessageSize), "max size of message")
9191
argPoW = flag.Float64("pow", whisper.DefaultMinimumPoW, "PoW for normal messages in float format (e.g. 2.7)")
9292
argServerPoW = flag.Float64("mspow", whisper.DefaultMinimumPoW, "PoW requirement for Mail Server request")
9393

@@ -198,18 +198,24 @@ func initialize() {
198198
peers = append(peers, peer)
199199
}
200200

201+
cfg := &whisper.Config{
202+
MaxMessageSize: uint32(*argMaxSize),
203+
MinimumAcceptedPOW: *argPoW,
204+
}
205+
201206
if *mailServerMode {
202207
if len(msPassword) == 0 {
203208
msPassword, err = console.Stdin.PromptPassword("Please enter the Mail Server password: ")
204209
if err != nil {
205210
utils.Fatalf("Failed to read Mail Server password: %s", err)
206211
}
207212
}
208-
shh = whisper.New()
213+
214+
shh = whisper.New(cfg)
209215
shh.RegisterServer(&mailServer)
210216
mailServer.Init(shh, *argDBPath, msPassword, *argServerPoW)
211217
} else {
212-
shh = whisper.New()
218+
shh = whisper.New(cfg)
213219
}
214220

215221
if *argPoW != whisper.DefaultMinimumPoW {
@@ -219,8 +225,8 @@ func initialize() {
219225
}
220226
}
221227

222-
if *argMaxSize != whisper.DefaultMaxMessageLength {
223-
err := shh.SetMaxMessageLength(*argMaxSize)
228+
if uint32(*argMaxSize) != whisper.DefaultMaxMessageSize {
229+
err := shh.SetMaxMessageSize(uint32(*argMaxSize))
224230
if err != nil {
225231
utils.Fatalf("Failed to set max message size: %s", err)
226232
}

internal/web3ext/web3ext.go

+36-26
Original file line numberDiff line numberDiff line change
@@ -526,10 +526,6 @@ const Shh_JS = `
526526
web3._extend({
527527
property: 'shh',
528528
methods: [
529-
new web3._extend.Method({
530-
name: 'info',
531-
call: 'shh_info'
532-
}),
533529
new web3._extend.Method({
534530
name: 'setMaxMessageLength',
535531
call: 'shh_setMaxMessageLength',
@@ -541,8 +537,8 @@ web3._extend({
541537
params: 1
542538
}),
543539
new web3._extend.Method({
544-
name: 'allowP2PMessagesFromPeer',
545-
call: 'shh_allowP2PMessagesFromPeer',
540+
name: 'markTrustedPeer',
541+
call: 'shh_markTrustedPeer',
546542
params: 1
547543
}),
548544
new web3._extend.Method({
@@ -570,57 +566,67 @@ web3._extend({
570566
params: 1
571567
}),
572568
new web3._extend.Method({
573-
name: 'generateSymmetricKey',
574-
call: 'shh_generateSymmetricKey',
569+
name: 'newSymKey',
570+
call: 'shh_newSymKey',
575571
}),
576572
new web3._extend.Method({
577-
name: 'addSymmetricKeyDirect',
578-
call: 'shh_addSymmetricKeyDirect',
573+
name: 'addSymKey',
574+
call: 'shh_addSymKey',
579575
params: 1
580576
}),
581577
new web3._extend.Method({
582-
name: 'addSymmetricKeyFromPassword',
583-
call: 'shh_addSymmetricKeyFromPassword',
578+
name: 'generateSymKeyFromPassword',
579+
call: 'shh_generateSymKeyFromPassword',
584580
params: 1
585581
}),
586582
new web3._extend.Method({
587-
name: 'hasSymmetricKey',
588-
call: 'shh_hasSymmetricKey',
583+
name: 'hasSymKey',
584+
call: 'shh_hasSymKey',
589585
params: 1
590586
}),
591587
new web3._extend.Method({
592-
name: 'getSymmetricKey',
593-
call: 'shh_getSymmetricKey',
588+
name: 'getSymKey',
589+
call: 'shh_getSymKey',
594590
params: 1
595591
}),
596592
new web3._extend.Method({
597-
name: 'deleteSymmetricKey',
598-
call: 'shh_deleteSymmetricKey',
593+
name: 'deleteSymKey',
594+
call: 'shh_deleteSymKey',
599595
params: 1
600596
}),
601597
new web3._extend.Method({
602598
name: 'subscribe',
603599
call: 'shh_subscribe',
604-
params: 1
600+
params: 2
605601
}),
606602
new web3._extend.Method({
607603
name: 'unsubscribe',
608604
call: 'shh_unsubscribe',
609605
params: 1
610606
}),
611607
new web3._extend.Method({
612-
name: 'getNewSubscriptionMessages',
613-
call: 'shh_getNewSubscriptionMessages',
608+
name: 'post',
609+
call: 'shh_post',
614610
params: 1
615611
}),
616612
new web3._extend.Method({
617-
name: 'getFloatingMessages',
618-
call: 'shh_getFloatingMessages',
613+
name: 'publicKey',
614+
call: 'shh_getPublicKey',
619615
params: 1
620616
}),
621617
new web3._extend.Method({
622-
name: 'post',
623-
call: 'shh_post',
618+
name: 'getFilterMessages',
619+
call: 'shh_getFilterMessages',
620+
params: 1
621+
}),
622+
new web3._extend.Method({
623+
name: 'deleteMessageFilter',
624+
call: 'shh_deleteMessageFilter',
625+
params: 1
626+
}),
627+
new web3._extend.Method({
628+
name: 'newMessageFilter',
629+
call: 'shh_newMessageFilter',
624630
params: 1
625631
})
626632
],
@@ -630,7 +636,11 @@ web3._extend({
630636
name: 'version',
631637
getter: 'shh_version',
632638
outputFormatter: web3._extend.utils.toDecimal
633-
})
639+
}),
640+
new web3._extend.Property({
641+
name: 'info',
642+
getter: 'shh_info'
643+
}),
634644
]
635645
});
636646
`

mobile/geth.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,9 @@ func NewNode(datadir string, config *NodeConfig) (stack *Node, _ error) {
169169
}
170170
// Register the Whisper protocol if requested
171171
if config.WhisperEnabled {
172-
if err := rawStack.Register(func(*node.ServiceContext) (node.Service, error) { return whisper.New(), nil }); err != nil {
172+
if err := rawStack.Register(func(*node.ServiceContext) (node.Service, error) {
173+
return whisper.New(&whisper.DefaultConfig), nil
174+
}); err != nil {
173175
return nil, fmt.Errorf("whisper init: %v", err)
174176
}
175177
}

0 commit comments

Comments
 (0)