【以太坊易错概念】nonce, 公私钥和地址,BASE64/BASE58,
以太坊里的nonce有两种意思,一个是proof of work nonce,一个是account nonce。
在智能合约里,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个字节(3 X 8) = 24 = (4 X 6)
当剩下的字符数量不足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树、公钥密码算法
2)全新的 SHA-3 加密标准 —— Keccak
3)在线加密算法
4)比特币地址生成算法详解
5)Base58Check编码实现示例
6) 比特币交易中的签名与验证
以太坊联合创始人表示,"汇总将推动ETH 2.0达到100k TPS
TPS度量标准被认为是任何区块链可扩展性的标准。
高TPS意味着经过考验的网络,能够扩展和快速处理用户交易。这部分有助于将区块链定位为集中式提供商的稳定替代方案。
目前,比特币提供4 TPS,而以太坊则提高到15TPS。NEO和Cardano等较小的加密货币称正在建立达到1,000 TPS的框架。
现在,随着ETH 2.0的到来,该协议可能会逐渐看到超过100,000 TPS,并计划随着“分片”的部署最终扩展到超过一百万。
如果发生这种情况,公共区块链比VISA慢的流行论点将被推翻。
六位数TPS即将进入以太坊
以太坊现年26岁的联合创始人Vitalik Buterin在本周早些时候发布了推文:
ETH 2.0对数据的扩展将先于一般计算,解释了以ETH 1.0作为数据层的2-3k TPS,然后用ETH 2.0达到100k TPS(阶段1)。
-vitalik.eth(@VitalikButerin)2020年6月30日
Buterin在线评论中指出“汇总可能会增加到成千上万个,”并补充说,碎片不需要“彼此同步交谈,从而能够实现结合了碎片可伸缩性的同步汇总。”
在相关的Reddit帖子上,Buterin给出了数学公式:
“64个分片*每个分片每个块256 kB / 12s插槽时间= 1.33 MB /秒。汇总:如果打包得当,则每tx约10-12个字节。1.33m /(10…12) 100k。”
他补充说,计算的前提是汇总“准备就绪,第1阶段分片准备就绪,并且人们实际使用了该技术。”
*截至6月30日的以太坊的TPS
"汇总"是什么?
对于初学者而言,汇总是第2层框架,可帮助将网络扩展到当前级别的倍数。汇总以其最基本的形式以压缩形式存储在以太坊区块链上的交易数据,而繁重的计算则发生在链下。
一个例子是乐观汇总,它最初由Buterin在2018年提出。一些团队也在构建特定于应用程序的zk-Rollup,并在相同的体系结构设计上进行迭代以满足他们的需求。
以太坊的input和log数据结构(记录以备忘)
以bsc上的一个普通的erc20转账交易0x1d5c883610f306b4fddd345398a9c8f56966e94decfe2be96c5108261d0be3cd( Binance Transaction Hash (Txhash) Details | BscScan )为例
input:’0xa9059cbb0000000000000000000000005a65a600e631a7228815fe72788de98a14853ca6000000000000000000000000000000000000000000000d725a4d7fc5f5669945’
前面4字节(8个十六进制)用来匹配调用的方法(用截取哈希值来匹配),这里匹配出来的是erc20的transfer方法:transfer(address recipient, uint256 amount)
再往后32个字节(64个十六进制)是第一个入参的值,这里是recipient地址0x5a65a600e631a7228815fe72788de98a14853ca6
再往后32个字节(64个十六进制)是第二个入参,这里是amount,把十六进制转回十进制即可
log:{
topic0:‘0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef’,
topic1:’ 0xfd0eee7d3984207a8b509a33531b2674e18428bf ’,
topic2:‘ 0x5a65a600e631a7228815fe72788de98a14853ca6 ’,
data:‘0x0000000000000000000000000000000000000000000004a9367788ad12364870‘
}
这里topic0是event方法的哈希,这里是 web3py.keccak(text='Transfer(address,address,uint256)').hex()
topic1,2,3分别是event里面的有indexed的入参,搜索得知transfer这个event的入参分别为address indexed from,address indexed to,正好对应着这里的topic1和topic2,即发送方和接收方的地址
data是event里面没有indexed的入参由先后顺序按照相应的类型所占的字节数分隔开就行了,这里就是uint256(也就是每个变量占64个十六进制的长度),转账金额
以太坊中的国际银行账号iban
简单地说,以太坊中的iban账号是以太坊为了和传统的银行系统对接而引入的概念,web3.js中提供了以太坊地址和iban地址之间的转换方法。
iban这个概念源于传统的银行系统,其英文全称为 International Bank Account Number ,即国际银行帐号。iban的作用是为全球任意一家银行中的任意一个账户生成一个全球唯一的账号,以便进行跨行交易。一个iban账号看起来像这样:
iban地址最多可以包含34个字母和数字,其中的字母大小写不敏感。在iban
中包含以下信息:
以太坊引入了一个新的IBAN国别码:XE,其中E代表Ethereum,X代表非法币(non-jurisdictional currencies)。同时,以太坊提出了三种BBAN的编码格式:direct、basic和indirect。
direct编码方案中的BBAN为30个字母/数字,只有一个字段:账户编号。例如,以太坊地址 00c5496aee77c1ba1f0854206a26dda82a81d6d8 转换为direct方案的BBAN账号,就得到 XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS 。
可以使用web3.js中的 web3.eth.Iban.fromEthereumAddress()
方法来执行这一转换:
basic编码方案与direct方案的唯一区别在于,其BBAN长度为31个字母/数字,因此该方案不兼容IBAN。
indrect编码方案中的BBAN长度为16个字母/数字,包含三个字段:
例如,一个采用indrect编码方案的以太坊iban账号,看起来是这样:
前面的 XE 表示国别码, 81 为校验和,后面的16个字符就是indrect编码的BBAN,其中:
如前所述,使用 web3.eth.Iban.fromEthereumAddress() 方法,可以将一个以太坊地址转换为direct编码方案的iban账号。与之对应的,可以使用 web3.eth.Iban.toAddress 方法,将一个采用direct编码方案的iban账号,转换回以太坊地址。例如:
iban账号中的校验和用来帮助核验一个给定字符串是否为有效的iban账号。可以使用web3.js中的 web3.eth.Iban.isValid()
来进行执行校验。例如:
原文:
以太坊stratum协议原理
参照比特币的 stratum协议 和 NiceHash的stratum协议规范 编写了一版以太坊版本的stratum协议说明.
stratum协议是目前最常用的矿机和矿池之间的TCP通讯协议。
以太坊是一个去中心化的网络架构,通过安装Mist客户端的节点来转发新交易和新区块。而矿机、矿池也同时形成了另一个网络,我们称之为矿工网络。
矿工网络分成矿机、矿池、钱包等几个主要部分,有时矿池软件与钱包安装在一起,可合称为矿池。
矿机与矿池软件之间的通讯协议是 stratum ,而矿池软件与钱包之间的通讯是 bitcoinrpc 接口。
stratum是 JSON 为数据格式.
矿机启动,首先以 mining.subscribe 方法向矿池连接,用来订阅工作。
矿池以 mining.notify 返回订阅号、ExtraNonce1和ExtraNonce2_size。
Client:
Server:
其中:
ae6812eb4cd7735a302a8a9dd95cf71f是 订阅号 ;
080c是 extranonce ,Extranonce可能最大3字节;
矿机以 mining.authorize 方法,用某个帐号和密码登录到矿池,密码可空,矿池返回 true 登录成功。该方法必须是在初始化连接之后马上进行,否则矿机得不到矿池任务。
Client:
Server:
难度调整由矿池下发给矿机,以 mining.set_difficulty 方法调整难度, params 中是难度值。
Server:
矿机会在下一个任务时采用新难度,矿池有时会马上下发一个新任务并且把清理任务设为true,以便矿机马上以新难度工作。
该命令由矿池定期发给矿机,当矿机以 mining.subscribe 方法登记后,矿池应该马上以 mining.notify 返回该任务。
Server:
任务ID : bf0488aa ;
seedhash : abad8f99f3918bf903c6a909d9bbc0fdfa5a2f4b9cb1196175ec825c6610126c 。每一个任务都发送一个seedhash来支持尽可能多的矿池,这可能会很快地在货币之间交换。
headerhash : 645cf20198c2f3861e947d4f67e3ab63b7b2e24dcc9095bd9123e7b33371f6cc 。
boolean cleanjobs : true 。如果设为true,那么矿工需要清理任务队列,并立即开始从事新提供的任务,因为所有旧的任务分享都将导致陈旧的分享错误。如果是 false 则等当前任务结束才开始新任务。
矿工使用seedhash识别DAG,然后带着headerhash,extranonce和自己的minernonce寻找低于目标的share(这是由提供的难度而产生的)。
矿机找到合法share时,就以” mining.submit “方法向矿池提交任务。矿池返回true即提交成功,如果失败则error中有具体原因。
Client:
任务ID : bf0488aa
minernonce : 6a909d9bbc0f 。注意minernonce是6个字节,因为提供的extranonce是2个字节。如果矿池提供3字节的extranonce,那么minernonce必须是5字节
Server:
一般的矿机与矿池通讯过程就如下所示:
以太坊技术系列-以太坊数据结构
本篇文章和大家介绍一下以太坊的数据结构,上篇文章我们提到,以太坊为了实现智能合约这一功能,使用了基于账户的模型。我们来看看以太坊中数据结构。
既然是基于账户的模型,我们需要通过账户地址找到账户的状态。就像通过银行卡号可以找到你在银行中的各种信息一样。最简单的想法当然是一个简单的哈希表 key是账户地址 value是账户状态。但这里有个问题解决不了。
轻节点如何校验账户合法性?
上篇我们说过,区块链中有2类节点,全节点和轻节点,轻节点只会存储block header,所以轻节点如何才能校验账号是否合法呢?
这个思路和我们平时用的md5校验一致,我们会对区块内的信息进行hash运算从而得出区块内信息唯一确定的值,区块链所有节点中这个值都是相同的。
在这个过程中我们用到了一种数据结构Merkle Tree(哈希树),我们先看下Merkle Tree(哈希树)的示意图。
上篇文章说到区块链中的链表(哈希链)和我们平时常见链表不同的是将指针从地址改为了hash指,这里也一样,哈希树和二叉树的区别有2个
1.将地址改为了哈希值
2.只有叶子节点存储数据
回到之前的问题轻节点是如何校验1个账户或交易是否是在链上的呢?
整个流程如上图所示
1.轻节点需要判断1个账号是否合法
2.轻节点由于只存储block header,所以拿到1个账号的时候会向全节点发出请求
3.全节点存储了所有账户状态,将账户路径中的需要计算用到的hash值返回给轻节点
4.轻节点本地进行计算根hash值,如果计算结果和自己存储一致则账户合法,不一致则不合法。
那以太坊中的账户信息的数据结构就是这样吗?
直接用这样的数据结构来存储账户信息会有2个问题
查找困难
生成hash值不确定
第1个问题应该比较容易发现,在这个树中寻找1个账号需要的复杂度是O(n),因为没有任何顺序。
第2个问题其实也是因为无序导致的,无序的组合每个节点针对同一批账户生成的hash值不一致,这就导致无法达成共识。
既然2个问题都和顺序有关,那我们类似二叉排序树一样,使用哈希排序树是不是就可以解决问题了呢?
使用排序树后会带来另外1个问题
插入困难
因为要维持树是有序的,很可能带来树结构的很大变动。
以太坊中使用了另外一种数据结构字典树。和哈希树不同,字典树应该是很多地方都有使用。我们简单来看下字典树的结构。
字典树能够较好地解决哈希树的2个缺点1.查找困难 2.生成的hash值不确定以及排序二叉树的1个缺点 插入困难。
但字典树我们可以看到可能树的深度可能由于部分元素导致整棵树深度非常深。
这时我们可以进一步优化,将相同路径进行压缩。这就是压缩字典树。
将哈希树和压缩字典树结合,就可以得到以太坊存储账户的最终数据结构-MPT。
将压缩字典树里面的指针从地址改为指针,并且将数据存储在叶子节点中即可。
介绍完状态树的数据结构,我们接下来讨论1个问题,区块中存储的账户状态是什么样的范围。有2种选择。
只保存当时区块中产生交易的账户状态。
保存全局所有的账户。
我们可以看下这2种方式,无非就是空间和时间的平衡,只保存当前区块产生的交易意味着是做懒加载(需要的时候才去寻找账户),在区块链中这个代价是非常大的,因为寻找的账户之前从未交易过,这样会遍历整个区块链。另外一种保存全局的账户方式虽然看起来空间消耗较大,但查找快捷,而且空间的问题我们可以通过其他方式优化。所以最终以太坊选择了第2种每个区块都报错全局所有账户的方式。
我们来看下以太坊中是如何保存状态树的。
可以看到以太坊中虽然每个区块都保存了全部账户,但是会将未发生变化的账户状态指向前1个节点,本身只存储发生变化的状态,这样可以较大程度优化空间占用。
介绍完以太坊中比较复杂的状态树后,我们继续来看看以太坊中的另外两棵树,交易树和收据树。
首先介绍一下,为什么需要交易树收据树。
1.交易树
虽然以太坊是基于账户的模型,但是就像银行不仅会存储银行卡的余额,还会存储卡中的每笔钱怎么来的以及怎么花的。交易树中就存储着当前区块中的包含的所有交易。
2.收据树
由于智能合约的引入增加了不少复杂性,所以以太坊用收据树存储着一些交易操作的额外信息。比如交易过程中执行日志就包含在收据树中方便查询。收据树和交易树是一一对应的。每发生一次交易就会有一次收据。
和状态树不同交易树和收据树只维护当前区块内发生的交易,因为当时区块发生交易时不需要再去查找另外1个交易,也就之前需要可能遍历整个区块链的查找操作了。
由于以太坊中的出块速度较快,我们进行一些查询一些符合条件交易的时候会面临大量数据遍历困难的问题。收据树中引入了布隆过滤器可以帮助我们有效缓解这一困难。
布隆过滤器将大集合中每个元素进行hash运算映射到1个较小的集合,这时再来1个元素要判断是否在大集合的时候,不需要遍历整个大集合,而是去进行hash运算去小集合中寻找是否存在,如果不存在,肯定不在大集合中,如果存在则不能说明任何问题。
如上图所示,布隆过滤器只能证明某1个元素不在集合中,不能证明1个元素在结合中。
以太坊中如果我们要在较多区块中寻找某1个交易,则可以利用布隆过滤器,过滤掉肯定不存在目标交易的区块,然后进入收据树内继续利用布隆过滤器筛选,剩下的才是可能的目标交易的交易,进行一一比对即可。
我们介绍了以太坊的核心数据结构,状态树交易树收据树,他们都是使用相同的数据结构-哈希压缩字典树。但状态树是维护1颗全局账户树,交易树和收据树则是维护本区块内的交易或收据。
介绍完数据结构后,后面我们会用几篇文章来介绍以太坊中的一些核心算法,比如共识机制,挖矿算法等。
上述文章就是科灵网介绍的以太坊交易数据格式和以太坊交易量查询的详细回答,希望能够帮助到大家;如果你还想了解更多财经资讯知识,记得收藏关注我们。
标签: 以太坊交易数据格式