whisper: use package rlp

This commit is contained in:
Felix Lange 2015-03-21 00:49:58 +01:00
parent a829a56587
commit 483d43a15a
2 changed files with 25 additions and 38 deletions

View File

@ -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
} }

View File

@ -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
} }