时间:2023-08-05 17:27:02 | 来源:网站运营
时间:2023-08-05 17:27:02 来源:网站运营
P2P网络架构设计及部分细节实现:r = bytes_sent / (bytes_recv + 1)P = 1 − 1 / (1 + exp(6 − 3r))
idx := 计算与本节点ID的距离table[idx] = append(table[idx], entry)backup(table[20:]) // 作为备份信息table[idx] = table[idx][:20]
计算距离的算法如下:func prefixLength(xor uint8) uint { switch { case xor == 1: return 7 case xor >= 2 && xor <= 3: return 6 case xor >= 4 && xor <= 7: return 5 case xor >= 8 && xor <= 15: return 4 case xor >= 16 && xor <= 31: return 3 case xor >= 32 && xor <= 63: return 2 case xor >= 64 && xor <= 127: return 1 case xor >= 128 && xor <= 255: return 0 } return 8}func calcDistance(a, b []byte) uint { c := uint(0) for i := 0; i < len(a) && i < len(b); i++ { x := a[i] ^ b[i] if x == 0 { c += 8 } else { c += prefixLength(x) break } } return uint(len(a))*8 - c}
| length | msgHash | msg |
concat := func(a, b uint) uint { v, _ := strconv.Atoi(fmt.Spintf("%d%d", a, b)) return uint(v)}mod := func(x, y uint) uint { return x % y}pow := func(x, y uint) uint { return uint(math.Pow(x, y))}
算法:A, B : set p = 23, g = 5A : generate a = 6, set va=mod(concat(g, a), p)=8 , sendTo(B, 8) // 56 % 23 == 8B : generate b = 15, set vb=mod(concat(g, b), p)=19 , sendTo(A, 19) // 515 % 23 == 19A : set secret=mod(pow(vb, a), p)=2 // 47045881 % 23=19B : set secret=mod(pow(va, b), p)=2 // 35184372088832% 23 = 2
密钥安全性保证证明如下:type Message struct { topic string // 消息主题,此处是 txpool code uint payload []byte // 消息体,解析方式需由各模块自定义 推荐google/proto.Marshal/Unmarshal}type Context interface { Send(uint32, []byte) // 模块调用p2p向远程节点发送消息 ID() string // 节点标识符 Topic()string ...}type PeerHandler interface { NewPeer(Context)TopicHandler ...}type TopicHandler interface { Setup()error Handle(uint32, []byte) error // 远程节点向本节点发消息 Treardown()}func readLoop(conn Conn) { for { data := conn.Read() // 消息完整性检测、数据加解密在conn封装层完成 go disptath(data) ... }}var mTopicHandler map[string]TopicHandlerfunc dispatch(data []byte) { topic, code, payload := decode(data) h, exists := mTopicHandler[topic] // 依据 topic做路由 if exists{ h.Handle(code, payload) } ...}type TxPoolServer server { txHandlers map[string]txHandler}func (self *TxPoolServer)NewPeer(ctx context) TxPoolHandler { h := txHandler{...} self.txHandlers[ctx.ID()] = h ... return h}func (self TxPoolServer)broadcastTx(tx Transaction, except func(string)bool){ // 广播交易 payload = encode(tx) for id, h := range self.txHandlers{ if except!=nil && except(id){ // 哪些节点不能发 continue } h.Send(1, payload) }}func (self txHandler)Handle(code uint, msg []byte) error { switch code { case 1: // new tx ... } return nil}
p2p模块应该对外只承担消息发送与接受、对内实现节点发现的功能,具体的业务逻辑不应该交由p2p处理,事实上主流公链也都采用如下的架构来解耦具体业务:关键词:部分,细节,实现,设计,网络