以太坊csdn以太坊合并

这篇文章给大家聊聊关于以太坊csdn,以及以太坊合并对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录【深度知识】以太坊数据序列化RLP...

这篇文章给大家聊聊关于以太坊csdn,以及以太坊合并对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

本文目录

【深度知识】以太坊数据序列化RLP编码/解码原理虚拟货币、数字货币、加密货币、代币、通证有什么区别Python3 使用Web3.py查询以太坊账户余额【以太坊易错概念】nonce, 公私钥和地址,BASE64/BASE58,【深度知识】以太坊数据序列化RLP编码/解码原理RLP(RecursiveLengthPrefix),中文翻译过来叫递归长度前缀编码,它是以太坊序列化所采用的编码方式。RLP主要用于以太坊中数据的网络传输和持久化存储。

对象序列化方法有很多种,常见的像JSON编码,但是JSON有个明显的缺点:编码结果比较大。例如有如下的结构:

变量s序列化的结果是{"name":"icattlecoder","sex":"male"},字符串长度35,实际有效数据是icattlecoder和male,共计16个字节,我们可以看到JSON的序列化时引入了太多的冗余信息。假设以太坊采用JSON来序列化,那么本来50GB的区块链可能现在就要100GB,当然实际没这么简单。

所以,以太坊需要设计一种结果更小的编码方法。

RLP编码的定义只处理两类数据:一类是字符串(例如字节数组),一类是列表。字符串指的是一串二进制数据,列表是一个嵌套递归的结构,里面可以包含字符串和列表,例如["cat",["puppy","cow"],"horse",[[]],"pig",[""],"sheep"]就是一个复杂的列表。其他类型的数据需要转成以上的两类,转换的规则不是RLP编码定义的,可以根据自己的规则转换,例如struct可以转成列表,int可以转成二进制(属于字符串一类),以太坊中整数都以大端形式存储。

从RLP编码的名字可以看出它的特点:一个是递归,被编码的数据是递归的结构,编码算法也是递归进行处理的;二是长度前缀,也就是RLP编码都带有一个前缀,这个前缀是跟被编码数据的长度相关的,从下面的编码规则中可以看出这一点。

对于值在[0,127]之间的单个字节,其编码是其本身。

例1:a的编码是97。

如果byte数组长度l<=55,编码的结果是数组本身,再加上128+l作为前缀。

例2:空字符串编码是128,即128=128+0。

例3:abc编码结果是131979899,其中131=128+len("abc"),979899依次是abc。

如果数组长度大于55,编码结果第一个是183加数组长度的编码的长度,然后是数组长度的本身的编码,最后是byte数组的编码。

请把上面的规则多读几篇,特别是数组长度的编码的长度。

例4:编码下面这段字符串:

Thelengthofthissentenceismorethan55bytes,IknowitbecauseIpre-designedit

这段字符串共86个字节,而86的编码只需要一个字节,那就是它自己,因此,编码的结果如下:

184868410410132108101110103116104321111023211610410511532115101110116101110991013210511532109111114101321161049711032535332981211161011154432733210711011111932105116329810199971171151013273321121141014510010111510510311010110032105116

其中前三个字节的计算方式如下:

184=183+1,因为数组长度86编码后仅占用一个字节。

86即数组长度86

84是T的编码

例5:编码一个重复1024次"a"的字符串,其结果为:18540979797979797...。

1024按bigendian编码为0040,省略掉前面的零,长度为2,因此185=183+2。

规则1~3定义了byte数组的编码方案,下面介绍列表的编码规则。在此之前,我们先定义列表长度是指子列表编码后的长度之和。

如果列表长度小于55,编码结果第一位是192加列表长度的编码的长度,然后依次连接各子列表的编码。

注意规则4本身是递归定义的。

例6:["abc","def"]的编码结果是200131979899131100101102。

其中abc的编码为131979899,def的编码为131100101102。两个子字符串的编码后总长度是8,因此编码结果第一位计算得出:192+8=200。

如果列表长度超过55,编码结果第一位是247加列表长度的编码长度,然后是列表长度本身的编码,最后依次连接各子列表的编码。

规则5本身也是递归定义的,和规则3相似。

例7:

["Thelengthofthissentenceismorethan55bytes,","IknowitbecauseIpre-designedit"]

的编码结果是:

248881798410410132108101110103116104321111023211610410511532115101110116101110991013210511532109111114101321161049711032535332981211161011154432163733210711011111932105116329810199971171151013273321121141014510010111510510311010110032105116

其中前两个字节的计算方式如下:

248=247+1

88=86+2,在规则3的示例中,长度为86,而在此例中,由于有两个子字符串,每个子字符串本身的长度的编码各占1字节,因此总共占2字节。

第3个字节179依据规则2得出179=128+51

第55个字节163同样依据规则2得出163=128+35

例8:最后我们再来看个稍复杂点的例子以加深理解递归长度前缀,

["abc",["Thelengthofthissentenceismorethan55bytes,","IknowitbecauseIpre-designedit"]]

编码结果是:

24894131979899248881798410410132108101110103116104321111023211610410511532115101110116101110991013210511532109111114101321161049711032535332981211161011154432163733210711011111932105116329810199971171151013273321121141014510010111510510311010110032105116

列表第一项字符串abc根据规则2,编码结果为131979899,长度为4。

列表第二项也是一个列表项:

["Thelengthofthissentenceismorethan55bytes,","IknowitbecauseIpre-designedit"]

根据规则5,结果为

248881798410410132108101110103116104321111023211610410511532115101110116101110991013210511532109111114101321161049711032535332981211161011154432163733210711011111932105116329810199971171151013273321121141014510010111510510311010110032105116

长度为90,因此,整个列表的编码结果第二位是90+4=94,占用1个字节,第一位247+1=248

以上5条就是RPL的全部编码规则。

各语言在具体实现RLP编码时,首先需要将对像映射成byte数组或列表两种形式。以go语言编码struct为例,会将其映射为列表,例如Student这个对象处理成列表["icattlecoder","male"]

如果编码map类型,可以采用以下列表形式:

[["",""],["",""],["",""]]

解码时,首先根据编码结果第一个字节f的大小,执行以下的规则判断:

1.如果f∈[0,128),那么它是一个字节本身。

2.如果f∈[128,184),那么它是一个长度不超过55的byte数组,数组的长度为l=f-128

3.如果f∈[184,192),那么它是一个长度超过55的数组,长度本身的编码长度ll=f-183,然后从第二个字节开始读取长度为ll的bytes,按照BigEndian编码成整数l,l即为数组的长度。

4.如果f∈(192,247],那么它是一个编码后总长度不超过55的列表,列表长度为l=f-192。递归使用规则1~4进行解码。

5.如果f∈(247,256],那么它是编码后长度大于55的列表,其长度本身的编码长度ll=f-247,然后从第二个字节读取长度为ll的bytes,按BigEndian编码成整数l,l即为子列表长度。然后递归根据解码规则进行解码。

以上解释了什么叫递归长度前缀编码,这个名字本身很好的解释了编码规则。

(1)以太坊源码学习—RLP编码(https://segmentfault.com/a/1190000011763339)

(2)简单分析RLP编码原理

(https://blog.csdn.net/itchosen/article/details/78183991)

虚拟货币、数字货币、加密货币、代币、通证有什么区别一、定义不同:

1.虚拟货币:

虚拟货币为指非真实的货币。

2.数字货币:

数字货币为电子货币形式的替代货币。数字金币和密码货币都属于数字货币(DIGICCY)。

3.加密货币:

加密货币为一种使用密码学原理来确保交易安全及控制交易单位创造的交易媒介。

4.代币(通证):

一种形状及尺寸类似货币,但限制使用范围、不具通货效力的物品,其通证则为代币英文Token的谐音。

二、特点不同:

1.虚拟货币:

虚拟货币不是一般等价物,而是价值相对性的表现形式,或者说是表现符号;也可以说,虚拟货币是个性化货币。在另一种说法中,也可称为信息货币。

2.数字货币:

是一种不受管制的、数字化的货币,通常由开发者发行和管理,被特定虚拟社区的成员所接受和使用。

3.加密货币:

加密货币基于去中心化的共识机制,与依赖中心化监管体系的银行金融系统相对。

4.代币(通证):

通常需要以金钱换取,用在商店、游乐场、大众运输工具等地方,做为凭证以使用服务、换取物品等。

扩展资料

现阶段数字货币更像一种投资产品,因为缺乏强有力的担保机构维护其价格的稳定,其作为价值尺度的作用还未显现,无法充当支付手段。数字货币作为投资产品,其发展离不开交易平台、运营公司和投资。

数字货币是一把双刃剑,一方面,其所依托的区块链技术实现了去中心化,可以用于数字货币以外的其他领域,这也是比特币受到热捧的原因之一;另一方面,如果数字货币被作为一种货币受到公众的广泛使用,则会对货币政策有效性、金融基础设施、金融市场、金融稳定等方面产生巨大影响。

参考资料来源:百度百科-虚拟货币

参考资料来源:百度百科-数字货币

参考资料来源:百度百科-加密货币

参考资料来源:百度百科-代币

Python3 使用Web3.py查询以太坊账户余额fromweb3importWeb3

defQuerryBalanceETH(accounts):

  w3=Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/{此处设置自己托管账户ID}'))

  #accounts=w3.eth.accounts

  balance=w3.eth.getBalance(accounts,'latest')#latest表示使用区块链中最后一个块的状态,也就是最后的余额

  print('balance@latest=>{0}'.format(balance))

  returnbalance

1、什么是Infura?

专业一点讲,Infura是一种IaaS(InfrastructureasaService)产品,目的是为了降低访问以太坊数据的门槛。

通俗一点讲,Infura就是一个可以让你的dApp快速接入以太坊的平台,不需要本地运行以太坊节点。

从程序员的角度讲,Infura就是一个Web3Provider,背后是负载均衡的API节点集群。使用它的好处就是,你永远不必担心连接的节点失效的问题,Infura会管理好这一切。

除此之外,Infura还可以很方便地接入IPFS,这是另外一个话题,这里就不讨论了。

最后,也是非常重要的一点:Infura目前是免费的。

2、如何使用Infura?

使用Infura首先需要注册一个账户,访问官网https://infura.io,点击注册并提供一个邮箱,会收到一封邮件,点击邮件中的链接激活就可以了,然后你就会看到下面的界面:

点击右上角的黑色按钮,创建新项目,就可以生成你专属的ProjectID了(左边的红框)。

参考文章:https://blog.csdn.net/TurkeyCock/article/details/85103434

【以太坊易错概念】nonce, 公私钥和地址,BASE64/BASE58,以太坊里的nonce有两种意思,一个是proofofworknonce,一个是accountnonce。

在智能合约里,nonce的值代表的是该合约创建的合约数量。只有当一个合约创建另一个合约的时候才会增加nonce的值。但是当一个合约调用另一个合约中的method时nonce的值是不变的。

在以太坊中nonce的值可以这样来获取(其实也就是属于一个账户的交易数量):

但是这个方法只能获取交易once的值。目前是没有内置方法来访问contract中的nonce值的

通过椭圆曲线算法生成钥匙对(公钥和私钥),以太坊采用的是secp256k1曲线,

公钥采用uncompressed模式,生成的私钥为长度32字节的16进制字串,公钥为长度64的公钥字串。公钥04开头。

把公钥去掉04,剩下的进行keccak-256的哈希,得到长度64字节的16进制字串,丢掉前面24个,拿后40个,再加上"0x",即为以太坊地址。

整个过程可以归纳为:

2)有些网关或系统只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,而且base64特别适合在http,mime协议下快速传输数据。Base64使用【字母azAZ数字09和+/】这64个字符编码。原理是将3个字节转换成4个字节(3X8)=24=(4X6)

当剩下的字符数量不足3个字节时,则应使用0进行填充,相应的,输出字符则使用'='占位,因此编码后输出的文本末尾可能会出现1至2个'='。

1)Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。

Base58Check是一种常用在比特币中的Base58编码格式,增加了错误校验码来检查数据在转录中出现的错误。校验码长4个字节,添加到需要编码的数据之后。校验码是从需要编码的数据的哈希值中得到的,所以可以用来检测并避免转录和输入中产生的错误。使用Base58check编码格式时,编码软件会计算原始数据的校验码并和结果数据中自带的校验码进行对比。二者不匹配则表明有错误产生,那么这个Base58Check格式的数据就是无效的。例如,一个错误比特币地址就不会被钱包认为是有效的地址,否则这种错误会造成资金的丢失。

为了使用Base58Check编码格式对数据(数字)进行编码,首先我们要对数据添加一个称作“版本字节”的前缀,这个前缀用来明确需要编码的数据的类型。例如,比特币地址的前缀是0(十六进制是0x00),而对私钥编码时前缀是128(十六进制是0x80)。表4-1会列出一些常见版本的前缀。

接下来,我们计算“双哈希”校验码,意味着要对之前的结果(前缀和数据)运行两次SHA256哈希算法:

checksum=SHA256(SHA256(prefix+data))

在产生的长32个字节的哈希值(两次哈希运算)中,我们只取前4个字节。这4个字节就作为校验码。校验码会添加到数据之后。

结果由三部分组成:前缀、数据和校验码。这个结果采用之前描述的Base58字母表编码。下图描述了Base58Check编码的过程。

相同:

1)哈希算法、Merkle树、公钥密码算法

https://blog.csdn.net/s_lisheng/article/details/77937202?from=singlemessage

2)全新的SHA-3加密标准——Keccak

https://blog.csdn.net/renq_654321/article/details/79797428

3)在线加密算法

http://tools.jb51.net/password/hash_md5_sha

4)比特币地址生成算法详解

https://www.cnblogs.com/zhaoweiwei/p/address.html

5)Base58Check编码实现示例

https://blog.csdn.net/QQ604666459/article/details/82419527

6)比特币交易中的签名与验证

https://www.jianshu.com/p/a21b7d72532f

OK,关于以太坊csdn和以太坊合并的内容到此结束了,希望对大家有所帮助。

美国股市有休息吗

理财买基金收益

尘世美歌词

2022年虚拟数字货币

上一篇: 以太坊asic以太坊asic矿机
下一篇: 以太坊dapp数量以太坊dapp排行榜
相关推荐

猜你喜欢