如何用以太坊源码解析建立自己的电子货币?

(递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式。RLP的唯一目标就是解决结构体的编码问题;对原子数据类型(比如,字符串,整数型,浮点型)的编码则交给更高层的协议;以太坊中要求数字必须是一个大端字节序的、没有零占位的存储的格式(也就是说,一个整数0和一个空数组是等同的)。
如果想学习go语言中的反射用法,这个包里面倒是有比较完善的学习示例,感兴趣的可以看看.
下面是我写的一个使用示例,演示如何使用rlp这个包.
rlp目的是可以将常用的数据结构,uint,string,[]byte,struct,slice,array,big.int等序列化以及反序列化.
要注意的是rlp特别不支持有符号数的序列化
具体用法见下
type TestRlpStruct struct {
BigInt *big.Int
func TestRlp(t *testing.T) {
//1.将一个整数数组序列化
arrdata, err := rlp.EncodeToBytes([]uint{32, 28})
fmt.Printf(&unuse err:%v\n&, err)
//fmt.Sprintf(&data=%s,err=%v&, hex.EncodeToString(arrdata), err)
//2.将数组反序列化
var intarray []uint
err = rlp.DecodeBytes(arrdata, &intarray)
//intarray 应为{32,28}
fmt.Printf(&intarray=%v\n&, intarray)
//3.将一个布尔变量序列化到一个writer中
writer := new(bytes.Buffer)
err = rlp.Encode(writer, true)
//fmt.Sprintf(&data=%s,err=%v&,hex.EncodeToString(writer.Bytes()),err)
//4.将一个布尔变量反序列化
var b bool
err = rlp.DecodeBytes(writer.Bytes(), &b)
fmt.Printf(&b=%v\n&, b)
//5.将任意一个struct序列化
//将一个struct序列化到reader中
_, r, err := rlp.EncodeToReader(TestRlpStruct{3, &44&, []byte{0x12, 0x32}, big.NewInt(32)})
var teststruct TestRlpStruct
err = rlp.Decode(r, &teststruct)
//{A:0x3, B:&44&, C:[]uint8{0x12, 0x32}, BigInt:32}
fmt.Printf(&teststruct=%#v\n&, teststruct)
阅读(...) 评论()1&分布式网络介绍
1.1 Kad网介绍
1.2 Kad网络节点距离
1.4 Kad通信协议
2&邻居节点
2.1 NodeTable类主要成员
2.2&邻居节点发现方法
2.3&邻居节点网络拓扑及刷新机制。
1&分布式网络介绍
以太坊底层分布式网络即P2P网络,使用了经典的Kademlia网络,简称kad。
1.1&Kad网介绍
Kademlia在2002年由美国纽约大学的PetarP.Manmounkov和DavidMazieres提出,是一种分布式散列表(DHT)技术,以异或运算为距离度量基础,已经在BitTorrent、BitComet、Emule等软件中得到应用。
1.2 Kad网络节点距离&&&&&&&&&&&&&&&
以太坊网络节点距离计算方法:
Node1:节点1 NodeId
Node2:节点2 NodeId
Kad的路由表是通过称为K桶的数据构造而成,K桶记录了节点NodeId,distance,endpoint,ip等信息。以太坊K桶按照与target节点距离进行排序,共256个K桶,每个K桶包含16个节点。
1.4 Kad通信协议
&&&&以太坊Kad网络中节点间通信基于UDP,主要由以下几个命令构成,若两个节点间PING-PONG握手通过,则认为相应节点在线。
Kad通信协议,基于UDP
探测一个节点,判断其是否在线
struct PingNode
&&&&&&&& h256 &version = 0x3;
&&&&&&&& Endpoint &
&&&&&&&& Endpoint &
&&&&&&&& uint32_t &
PING命令响应
struct Pong
&&&&&&&&&&&&&&&&&&&&&& E
&&&&&&&&&&&&&&&&&&&&&& h256
&&&&&&&&&&&&&&&&&&&&&& uint32_
向节点查询某个与目标节点ID距离接近的节点
struct FindNeighbours
&&&&&&&&&&&&&&&&&&&&&& NodeI&&&&&&&&&&&&&&&& uint32_
FIND_NODE命令响应,发送与目标节点ID距离接近的K桶中的节点
struct Neighbours
&&&&&&&&&&&&&&&&&&&&&& list nodes: struct Neighbour
&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& inline E
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& NodeI
&&&&&&&&&&&&&&&&&&&&&& };
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&& uint32_
2&邻居节点
2.1 NodeTable类主要成员
C++版本以太坊源码中,NodeTable是以太坊&P2P网络的关键类,所有与邻居节点相关的数据和方法均由NodeTable类实现。
本节点,包含NodeId、endpoint、ip等
K桶,包含邻居节点的NodeId、distance、endpoint、ip
已知的节点信息,但并没有加入到K桶
NodeTable::NodeTable(ba::io_service& &_io, KeyPair const& _alias, NodeIPEndpoint const& _endpoint, bool &_enabled)
cpp-ethereum
/libp2p/NodeTable.cpp
NodeTable类构造函数,初始化K桶,发起邻居节点发现过程
void &NodeTable::doDiscovery()
Cpp-ethereum
/libp2p/NodeTable.cpp
具体发现函数
shared_ptr&NodeEntry& &NodeTable::addNode(Node const& _node, NodeRelation _relation)
cpp-ethereum
/libp2p/NodeTable.cpp
将节点加入m_nodes,并发起ping握手
void &NodeTable::doDiscover(NodeID _node, unsigned _round, &shared_ptr&set&shared_ptr&NodeEntry&&& _tried)
cpp-ethereum
/libp2p/NodeTable.cpp
底层发现函数,从k桶中选出节点,发送FINDNODE命令
vector&shared_ptr&NodeEntry&& &NodeTable::nearestNodeEntries(NodeID _target)
cpp-ethereum
/libp2p/NodeTable.cpp
从K桶中选出节点
void &NodeTable::onReceived(UDPSocketFace*, bi::udp::endpoint const& _from, &bytesConstRef _packet)
cpp-ethereum
/libp2p/NodeTable.cpp
Kad协议处理
void &NodeTable::noteActiveNode(Public const& _pubk, bi::udp::endpoint &const& _endpoint)
cpp-ethereum
/libp2p/NodeTable.cpp
将新节点加入到K桶
2.2&邻居节点发现方法
&&&&&邻居节点是指加入到K桶,并通过PING-PONG握手的节点。
邻居节点发现流程说明:
系统第一次启动随机生成本机节点NodeId,记为LocalId,生成后将固定不变,本地节点记为local-eth。
系统读取公共节点信息,ping-pong握手完成后,将其写入K桶。
系统每隔7200ms刷新一次K桶。
刷新K桶流程如下:
a.&&&&&&随机生成目标节点Id,记为TargetId,从1开始记录发现次数和刷新时间。
b.&&&&&&计算TargetId与LocalId的距离,记为Dlt
c.&&&&&&K桶中节点的NodeId记为KadId,计算KadId与TargetId的距离,记为Dkt
d.&&&&&&找出K桶中Dlt大于Dkt的节点,记为k桶节点,向k桶节点发送FindNODE命令,FindNODE命令包含TargetId
e.&&&&&&K桶节点收到FindNODE命令后,同样执行b-d的过程,将从K桶中找到的节点使用Neighbours命令发回给本机节点。
f.&&&&&&&本机节点收到Neighbours后,将收到的节点写入到K桶中。
g.&&&&&&若搜索次数不超过8次,刷新时间不超过600ms,则返回到b步骤循环执行。
2.3&邻居节点网络拓扑及刷新机制。
1 TargetId为随机生成的虚拟节点ID。
2&以太坊Kad网络与传统Kad网络的区别:
以太坊节点在发现邻居节点的8次循环中,所查找的节点均在距离上向随机生成的TargetId收敛。
传统Kad网络发现节点时,在距离上向节点本身收敛。
本文由HPB(芯链)团队整理。
阅读(...) 评论()详解以太坊的工作原理 - 山寨币开发
&&&&&&&&&&详解以太坊的工作原理
我们的服务/Brand
+我们的服务理念设计
钱包开发,win和linux,手机钱包,矿池,区块浏览器,官网,标识为新生电子货币打造强势品牌!
+助力发展互联网金融快捷支付
助力中小企业的发展,实现免支付政税、增值税、企业所得税,为企业形象及品牌建立一个新的发展路径!
+山寨币维护与区块更新
开发新币的细分区块,数据链的分叉问题,我们每周为用户做好更新源数据支持,保证钱包的完整性!
+做币包装品牌规划设计
精准的推广目光,定位于币核心用途、符合企业线上 线下合作,帮助用户在互联网金融中脱颖而出!
/Logo Design
做币开发联系我们/catanct
邮编:511083
网站:www.qqya.cc
博客:blog.sina.com.cn/u/
公司:惠州优尼网络(Uuin)比特币开发公司他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)以太坊代币如何制作在中国的行情怎么样?
之前电子货币在中国流行起来的时候,中国的代表银行对于这种经营交易模式保持的是观望的态度,既不肯定也不否定,所以在中国以太坊代币行情一直是比较稳定的,但是今年似乎有了重大的突破,中国银行召开了这方面的会议,会议上做了很多的讨论和研究,有人猜测这是中国要跟上国际的步伐。
看来虚拟的货币在中国的行情发展很好,用不了多久有可能央行也会发行属于自己的数字形式的货币,现在看来这种猜测并不是空穴来风,验证这种猜测需要的仅仅是时间而已。这是一场非常具有历史意义的会议可以说给以太坊代币行情带来了推动性的发展,给很多正在观望的企业也带来了信心。
这证明中国积极的审视现在社会的形式,跟上世界经济的发展,绝对不是之前那个保守的国家了。如果可以给广大人民带来利益,带来更好的生活,国家一定会积极的推动这个行业的发展。
如果央行想要推出自己发行的货币,那就要考虑很多的问题,比如说发行的步骤和方法,具体一些框架和实施的步骤,怎样让人们接受这种货币,把这种货币广泛的推广开来。必须要有创新,其实现在已经发行的一些货币都不是完美无缺的,怎样才能进行改革,创造出一个完善的货币体系是发行者应该考虑的问题,从现在的以太坊代币行情来看,不能够一味的模仿。
文章转载自:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 以太坊源码解析 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信