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