forked from cerc-io/plugeth
whisper/whisperv6: post returns the hash of sent message (#16495)
This commit is contained in:
parent
8feb31825e
commit
a16f12ba86
@ -227,8 +227,9 @@ type newMessageOverride struct {
|
|||||||
Padding hexutil.Bytes
|
Padding hexutil.Bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
// Post a message on the Whisper network.
|
// Post posts a message on the Whisper network.
|
||||||
func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, error) {
|
// returns the hash of the message in case of success.
|
||||||
|
func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (hexutil.Bytes, error) {
|
||||||
var (
|
var (
|
||||||
symKeyGiven = len(req.SymKeyID) > 0
|
symKeyGiven = len(req.SymKeyID) > 0
|
||||||
pubKeyGiven = len(req.PublicKey) > 0
|
pubKeyGiven = len(req.PublicKey) > 0
|
||||||
@ -237,7 +238,7 @@ func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, er
|
|||||||
|
|
||||||
// user must specify either a symmetric or an asymmetric key
|
// user must specify either a symmetric or an asymmetric key
|
||||||
if (symKeyGiven && pubKeyGiven) || (!symKeyGiven && !pubKeyGiven) {
|
if (symKeyGiven && pubKeyGiven) || (!symKeyGiven && !pubKeyGiven) {
|
||||||
return false, ErrSymAsym
|
return nil, ErrSymAsym
|
||||||
}
|
}
|
||||||
|
|
||||||
params := &MessageParams{
|
params := &MessageParams{
|
||||||
@ -252,20 +253,20 @@ func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, er
|
|||||||
// Set key that is used to sign the message
|
// Set key that is used to sign the message
|
||||||
if len(req.Sig) > 0 {
|
if len(req.Sig) > 0 {
|
||||||
if params.Src, err = api.w.GetPrivateKey(req.Sig); err != nil {
|
if params.Src, err = api.w.GetPrivateKey(req.Sig); err != nil {
|
||||||
return false, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set symmetric key that is used to encrypt the message
|
// Set symmetric key that is used to encrypt the message
|
||||||
if symKeyGiven {
|
if symKeyGiven {
|
||||||
if params.Topic == (TopicType{}) { // topics are mandatory with symmetric encryption
|
if params.Topic == (TopicType{}) { // topics are mandatory with symmetric encryption
|
||||||
return false, ErrNoTopics
|
return nil, ErrNoTopics
|
||||||
}
|
}
|
||||||
if params.KeySym, err = api.w.GetSymKey(req.SymKeyID); err != nil {
|
if params.KeySym, err = api.w.GetSymKey(req.SymKeyID); err != nil {
|
||||||
return false, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if !validateDataIntegrity(params.KeySym, aesKeyLength) {
|
if !validateDataIntegrity(params.KeySym, aesKeyLength) {
|
||||||
return false, ErrInvalidSymmetricKey
|
return nil, ErrInvalidSymmetricKey
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,36 +274,47 @@ func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, er
|
|||||||
if pubKeyGiven {
|
if pubKeyGiven {
|
||||||
params.Dst = crypto.ToECDSAPub(req.PublicKey)
|
params.Dst = crypto.ToECDSAPub(req.PublicKey)
|
||||||
if !ValidatePublicKey(params.Dst) {
|
if !ValidatePublicKey(params.Dst) {
|
||||||
return false, ErrInvalidPublicKey
|
return nil, ErrInvalidPublicKey
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// encrypt and sent message
|
// encrypt and sent message
|
||||||
whisperMsg, err := NewSentMessage(params)
|
whisperMsg, err := NewSentMessage(params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var result []byte
|
||||||
env, err := whisperMsg.Wrap(params)
|
env, err := whisperMsg.Wrap(params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// send to specific node (skip PoW check)
|
// send to specific node (skip PoW check)
|
||||||
if len(req.TargetPeer) > 0 {
|
if len(req.TargetPeer) > 0 {
|
||||||
n, err := discover.ParseNode(req.TargetPeer)
|
n, err := discover.ParseNode(req.TargetPeer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("failed to parse target peer: %s", err)
|
return nil, fmt.Errorf("failed to parse target peer: %s", err)
|
||||||
}
|
}
|
||||||
return true, api.w.SendP2PMessage(n.ID[:], env)
|
err = api.w.SendP2PMessage(n.ID[:], env)
|
||||||
|
if err == nil {
|
||||||
|
hash := env.Hash()
|
||||||
|
result = hash[:]
|
||||||
|
}
|
||||||
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensure that the message PoW meets the node's minimum accepted PoW
|
// ensure that the message PoW meets the node's minimum accepted PoW
|
||||||
if req.PowTarget < api.w.MinPow() {
|
if req.PowTarget < api.w.MinPow() {
|
||||||
return false, ErrTooLowPoW
|
return nil, ErrTooLowPoW
|
||||||
}
|
}
|
||||||
|
|
||||||
return true, api.w.Send(env)
|
err = api.w.Send(env)
|
||||||
|
if err == nil {
|
||||||
|
hash := env.Hash()
|
||||||
|
result = hash[:]
|
||||||
|
}
|
||||||
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:generate gencodec -type Criteria -field-override criteriaOverride -out gen_criteria_json.go
|
//go:generate gencodec -type Criteria -field-override criteriaOverride -out gen_criteria_json.go
|
||||||
|
Loading…
Reference in New Issue
Block a user