whisper: use package rlp
This commit is contained in:
parent
a829a56587
commit
483d43a15a
@ -28,9 +28,9 @@ type Envelope struct {
|
|||||||
|
|
||||||
func (self *Envelope) Hash() Hash {
|
func (self *Envelope) Hash() Hash {
|
||||||
if self.hash == EmptyHash {
|
if self.hash == EmptyHash {
|
||||||
self.hash = H(crypto.Sha3(common.Encode(self)))
|
enc, _ := rlp.EncodeToBytes(self)
|
||||||
|
self.hash = H(crypto.Sha3(enc))
|
||||||
}
|
}
|
||||||
|
|
||||||
return self.hash
|
return self.hash
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,7 +76,8 @@ func (self *Envelope) Open(prv *ecdsa.PrivateKey) (msg *Message, err error) {
|
|||||||
func (self *Envelope) proveWork(dura time.Duration) {
|
func (self *Envelope) proveWork(dura time.Duration) {
|
||||||
var bestBit int
|
var bestBit int
|
||||||
d := make([]byte, 64)
|
d := make([]byte, 64)
|
||||||
copy(d[:32], common.Encode(self.withoutNonce()))
|
enc, _ := rlp.EncodeToBytes(self.withoutNonce())
|
||||||
|
copy(d[:32], enc)
|
||||||
|
|
||||||
then := time.Now().Add(dura).UnixNano()
|
then := time.Now().Add(dura).UnixNano()
|
||||||
for n := uint32(0); time.Now().UnixNano() < then; {
|
for n := uint32(0); time.Now().UnixNano() < then; {
|
||||||
@ -96,39 +97,28 @@ func (self *Envelope) proveWork(dura time.Duration) {
|
|||||||
|
|
||||||
func (self *Envelope) valid() bool {
|
func (self *Envelope) valid() bool {
|
||||||
d := make([]byte, 64)
|
d := make([]byte, 64)
|
||||||
copy(d[:32], common.Encode(self.withoutNonce()))
|
enc, _ := rlp.EncodeToBytes(self.withoutNonce())
|
||||||
|
copy(d[:32], enc)
|
||||||
binary.BigEndian.PutUint32(d[60:], self.Nonce)
|
binary.BigEndian.PutUint32(d[60:], self.Nonce)
|
||||||
return common.FirstBitSet(common.BigD(crypto.Sha3(d))) > 0
|
return common.FirstBitSet(common.BigD(crypto.Sha3(d))) > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Envelope) withoutNonce() interface{} {
|
func (self *Envelope) withoutNonce() interface{} {
|
||||||
return []interface{}{self.Expiry, self.Ttl, common.ByteSliceToInterface(self.Topics), self.Data}
|
return []interface{}{self.Expiry, self.Ttl, self.Topics, self.Data}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Envelope) RlpData() interface{} {
|
// rlpenv is an Envelope but is not an rlp.Decoder.
|
||||||
return []interface{}{self.Expiry, self.Ttl, common.ByteSliceToInterface(self.Topics), self.Data, self.Nonce}
|
// It is used for decoding because we need to
|
||||||
}
|
type rlpenv Envelope
|
||||||
|
|
||||||
func (self *Envelope) DecodeRLP(s *rlp.Stream) error {
|
func (self *Envelope) DecodeRLP(s *rlp.Stream) error {
|
||||||
var extenv struct {
|
raw, err := s.Raw()
|
||||||
Expiry uint32
|
if err != nil {
|
||||||
Ttl uint32
|
|
||||||
Topics [][]byte
|
|
||||||
Data []byte
|
|
||||||
Nonce uint32
|
|
||||||
}
|
|
||||||
if err := s.Decode(&extenv); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if err := rlp.DecodeBytes(raw, (*rlpenv)(self)); err != nil {
|
||||||
self.Expiry = extenv.Expiry
|
return err
|
||||||
self.Ttl = extenv.Ttl
|
}
|
||||||
self.Topics = extenv.Topics
|
self.hash = H(crypto.Sha3(raw))
|
||||||
self.Data = extenv.Data
|
|
||||||
self.Nonce = extenv.Nonce
|
|
||||||
|
|
||||||
// TODO We should use the stream directly here.
|
|
||||||
self.hash = H(crypto.Sha3(common.Encode(self)))
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
protocolVersion = 0x02
|
protocolVersion uint64 = 0x02
|
||||||
)
|
)
|
||||||
|
|
||||||
type peer struct {
|
type peer struct {
|
||||||
@ -66,21 +66,18 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *peer) broadcast(envelopes []*Envelope) error {
|
func (self *peer) broadcast(envelopes []*Envelope) error {
|
||||||
envs := make([]interface{}, len(envelopes))
|
envs := make([]*Envelope, 0, len(envelopes))
|
||||||
i := 0
|
for _, env := range envelopes {
|
||||||
for _, envelope := range envelopes {
|
if !self.known.Has(env.Hash()) {
|
||||||
if !self.known.Has(envelope.Hash()) {
|
envs = append(envs, env)
|
||||||
envs[i] = envelope
|
self.known.Add(env.Hash())
|
||||||
self.known.Add(envelope.Hash())
|
|
||||||
i++
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if len(envs) > 0 {
|
||||||
if i > 0 {
|
if err := p2p.Send(self.ws, envelopesMsg, envs); err != nil {
|
||||||
if err := p2p.Send(self.ws, envelopesMsg, envs[:i]); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
self.peer.DebugDetailln("broadcasted", i, "message(s)")
|
self.peer.DebugDetailln("broadcasted", len(envs), "message(s)")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user