aboutsummaryrefslogtreecommitdiffstats
path: root/p2p/message.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-10-27 18:50:50 +0800
committerobscuren <geffobscura@gmail.com>2014-10-27 18:50:50 +0800
commit797b93c98cdd8183fca58f0c1c554b0d5af26d41 (patch)
tree10de24dc414b05cdb2a57dfa37db7e3f7a7c5605 /p2p/message.go
parentb095bd32371f02d204a4d0fbde75dc58baa7430d (diff)
parentf62b6742f2189f45463c362897e9f49a11d811a2 (diff)
downloadgo-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.tar
go-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.tar.gz
go-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.tar.bz2
go-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.tar.lz
go-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.tar.xz
go-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.tar.zst
go-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.zip
Merge branch 'develop' of github.com-obscure:ethereum/go-ethereum into develop
Diffstat (limited to 'p2p/message.go')
-rw-r--r--p2p/message.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/p2p/message.go b/p2p/message.go
new file mode 100644
index 000000000..4886eaa1f
--- /dev/null
+++ b/p2p/message.go
@@ -0,0 +1,75 @@
+package p2p
+
+import (
+ // "fmt"
+ "github.com/ethereum/eth-go/ethutil"
+)
+
+type MsgCode uint8
+
+type Msg struct {
+ code MsgCode // this is the raw code as per adaptive msg code scheme
+ data *ethutil.Value
+ encoded []byte
+}
+
+func (self *Msg) Code() MsgCode {
+ return self.code
+}
+
+func (self *Msg) Data() *ethutil.Value {
+ return self.data
+}
+
+func NewMsg(code MsgCode, params ...interface{}) (msg *Msg, err error) {
+
+ // // data := [][]interface{}{}
+ // data := []interface{}{}
+ // for _, value := range params {
+ // if encodable, ok := value.(ethutil.RlpEncodeDecode); ok {
+ // data = append(data, encodable.RlpValue())
+ // } else if raw, ok := value.([]interface{}); ok {
+ // data = append(data, raw)
+ // } else {
+ // // data = append(data, interface{}(raw))
+ // err = fmt.Errorf("Unable to encode object of type %T", value)
+ // return
+ // }
+ // }
+ return &Msg{
+ code: code,
+ data: ethutil.NewValue(interface{}(params)),
+ }, nil
+}
+
+func NewMsgFromBytes(encoded []byte) (msg *Msg, err error) {
+ value := ethutil.NewValueFromBytes(encoded)
+ // Type of message
+ code := value.Get(0).Uint()
+ // Actual data
+ data := value.SliceFrom(1)
+
+ msg = &Msg{
+ code: MsgCode(code),
+ data: data,
+ // data: ethutil.NewValue(data),
+ encoded: encoded,
+ }
+ return
+}
+
+func (self *Msg) Decode(offset MsgCode) {
+ self.code = self.code - offset
+}
+
+// encode takes an offset argument to implement adaptive message coding
+// the encoded message is memoized to make msgs relayed to several peers more efficient
+func (self *Msg) Encode(offset MsgCode) (res []byte) {
+ if len(self.encoded) == 0 {
+ res = ethutil.NewValue(append([]interface{}{byte(self.code + offset)}, self.data.Slice()...)).Encode()
+ self.encoded = res
+ } else {
+ res = self.encoded
+ }
+ return
+}