老铁们,大家好,相信还有很多朋友对于以太坊交易nonce和以太坊交易规则的相关问题不太懂,没关系,今天就由我来为大家分享分享以太坊交易nonce以及以太坊交易规则的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

本文目录

以太坊交易规则【以太坊易错概念】nonce, 公私钥和地址,BASE64/BASE58,以太坊ETH覆盖或删除处于pending状态交易如何创建和签署以太坊交易2021-01-19 记录一次以太坊nonce值的问题以太坊交易规则从外部账户发送到区块链上的另一个账户的消息和签名的数据包。

包含如下内容:

发送者的签名

接收的地址

转移的数字货币数量等内容

以太坊上的交易都是需要支付费用,和比特币以比特币来支付一定的交易费用不同,以太坊上固定了这个环节,那么这个间接理解是以太坊的一种安全防范错误,防止了大量的无意义的交易,保证一定的安全性,特别是智能合约的创建、执行、调用都需要消耗费用,那么也保证了整个系统的稳定性,防止了一些链上无意义的恶意行为。

交易手续费

以太坊的核心是EVM,以太坊虚拟机,那么在EVM中执行的字节码都是要支付费用。也就是经常看到的Gas、Gaslimit、GasPrice这几个概念。

Gas:字面理解就是汽油,以太坊和日常的汽车一样需要Gas才能运行。Gas是一笔交易过程中计算消耗的基本单位。有一个列表可以直观看到在以太坊中操作的Gas消耗量:

操作Gas消耗具体内容

step1执行周期的默认费用。

stop0终止操作是免费的。

suicide0智能合约账户的内部数据存储空间,当合约账户调用suicide()方法时,该值将被置为null。

sha320加解密

sload20在固定的存储器中去获取

sstore100输入到固定的存储器中

balance20账户余额

create100创建合约

call20初始化一个只读调用

memory1扩充内存额外支付的费用

txdata5交易过程中数据或者编码的每一个字节的消耗

transaction500交易费用

contractcreation53000homestead中目前从21000调整到53000

所以有些公司或者个人觉得区块链技术去中介化,不需要中心服务器,这种开发模式是比较便宜的,但是事实上区块链的开发不比之前的那些传统软件开发来的便宜。

GasPrice:字面理解汽油价格,这个就像你去加油站,95#汽油今天是什么价格。一个GasPrice就是单价,那么你的交易费用=Gas*GasPrice,然后以以太币来ether来支出。当然你觉得我不想支付费用,你可以设置GasPrice为0,但是选择权在矿工手中,矿工有权选择收纳交易和收取费用,那么最简单的想想很难让一个矿工去接收一个价格很低的交易吧。另外提一句,以太坊默认的GasPrice是1wei。

GasLimit:字面理解就是Gas的限制,限制是必要的,没有限制就没有约束。这个GasLimit是有两个意思的。首先针对单个交易,那么这个表示交易的发起者他愿意支付最多是多少Gas,这个交易发起者在发起交易的时候需要设置好。还有一个是针对区块的GasLimit,一个单独的区块也有Gas的限制。

假设几个场景来说明Gas的使用:

用户设置GasLimit,那么在交易过程中,如果你的实际消耗的Gasused

用户设置GasLimit,那么交易过程中,如果你的实际消耗的Gasused>GasLimit,那么矿工肯定发现你的Gas不足,这个交易就无法执行完成,这个之后会回滚到执行之前的状态,这个时候矿工会收取GasPrice*GasLimit。

区块的GasLimit,区块中有一个Gas上限,收纳的交易会出现不同的用户指定的GasLimit。那么矿工就会根据区块限制的GasLimit来选择,“合理”选择打包交易。

具体交易

以太坊上交易可以是简单的以太币的转移,同时也可以是智能合约的代码消息。列个表格看下交易的具体内容:

代码内容

from交易发起者的地址、不能为空,源头都没有不合理。

to交易接收者的地址(这个可以为空,空的时候就表示是一个合约的创建)

value转移的以太币数量

data数据字段。这个字段存在的时候表示的是,交易是一个创建或者是一个调用智能合约的交易

GasLimit字面理解就是Gas的限制,限制是必要的,没有限制就没有约束。这个GasLimit是有两个意思的。首先针对单个交易,那么这个表示交易的发起者他愿意支付最多是多少Gas,这个交易发起者在发起交易的时候需要设置好。还有一个是针对区块的GasLimit,一个单独的区块也有Gas的限制。

GasPrice一个GasPrice就是单价,那么你的交易费用=Gas*GasPrice,然后以以太币来ether来支出。以太坊默认的GasPrice是1wei。

nonce用于区别用户发出交易的标识。

hash交易ID,是由上述的信息生成的一个hash值

r、s、v交易签名的三部分,交易发起者的私钥对hash签名生成。

交易分三种类型

转账:简单明了的以太坊上的以太币的转移,就和比特币类似,A向B转移一定数量的以太币。这种交易包含:交易发起者、接收者、value的数量,其余类似GasLimit、hash、nonce都会默认生成。所以你会看到一段代码:

web3.eth.sendTransaction({from:"交易发起者地址",to:“交易接收者地址”,value:数量});

智能合约创建:创建智能合约就是把智能合约部署到区块链上,那么这个时候to是一个空的字段。data字段则是初始化合约的代码。所以看到代码:

web3.eth.sendTransaction({from:"交易发起者地址",data:"contractbinarycode"});

智能合约执行:合约创建部署在区块链上,那么执行就是会加上to字段到要智能合约执行的地址,然后data字段来指定调用的方法和参数的传递,所以看到代码:

web3.eth.sendTransaction({from:"交易发起者地址",to:“合约执行者地址”,data:“调用的方法和参数的传递”});

以上大致就是交易的类型。

【以太坊易错概念】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

以太坊ETH覆盖或删除处于pending状态交易有人肯定遇到跟我一样的问题,账号里还有一些eth,但是有一笔交易一直处于pending状态,导致后续的交易全部卡死。除非这一笔pending状态的交易被矿工打包。请注意nonce,由于每一个账号的每一个交易nonce都是递增的,因此如果用已经成功的交易的nonce重新交易,一定会报错noncetoolow。

1、发现有一笔订单一直处于pending状态,后续的所有交易都不能正常进行

2、解决方案,通过设置较高的gasprice来覆盖或替换该交易

3、接下来,该账号就可以正常转账啦。

目前市场上尚未找到能满足该功能的工具/钱包,如需提供技术服务,请联系作者,微信号:hqfeijian,备注:以太坊替换交易

如何创建和签署以太坊交易交易

区块链交易的行为遵循不同的规则集

由于公共区块链分布式和无需许可的性质,任何人都可以签署交易并将其广播到网络。

根据区块链的不同,交易者将被收取一定的交易费用,交易费用取决于用户的需求而不是交易中资产的价值。

区块链交易无需任何中央机构的验证。仅需使用与其区块链相对应的数字签名算法(DSA)使用私钥对其进行签名。

一旦一笔交易被签名,广播到网络中并被挖掘到网络中成功的区块中,就无法恢复交易。

以太坊交易结构

以太坊交易的数据结构:交易0.1个ETH

{

'nonce':'0x00',//十进制:0

'gasLimit':'0x5208',//十进制:21000

'gasPrice':'0x3b9aca00',//十进制1,000,000,000

'to':'0x17A98d2b11Dfb784e63337d2170e21cf5DD04631',//发送地址

'value':'0x16345785d8a0000',//100000000000000000,10^17

'data':'0x',//空数据的十进制表示

'chainId':1//区块链网络ID

}这些数据与交易内容无关,与交易的执行方式有关,这是由于在以太坊中发送交易中,您必须定义一些其他参数来告诉矿工如何处理您的交易。交易数据结构有2个属性设计"gas":"gasPrice","gasLimit"。

"gasPrice":单位为Gwei,为1/1000个eth,表示交易费用

"gasLimit":交易允许使用的最大gas费用。

这2个值通常由钱包提供商自动填写。

除此之外还需要指定在哪个以太坊网络上执行交易(chainId):1表示以太坊主网。

在开发时,通常会在本地以及测试网络上进行测试,通过测试网络发放的测试ETH进行交易以避免经济损失。在测试完成后再进入主网交易。

另外,如果需要提交一些其它数据,可以用"data"和"nonce"作为事务的一部分附加。

Anonce(仅使用1次的数字)是以太坊网络用于跟踪交易的数值,有助于避免网络中的双重支出以及重放攻击。

以太坊交易签名

以太坊交易会涉及ECDSA算法,以Javascript代码为例,使用流行的ethers.js来调用ECDSA算法进行交易签名。

constethers=require('ethers')

constsigner=newethers.Wallet('钱包地址')

signer.signTransaction({

'nonce':'0x00',//十进制:0

'gasLimit':'0x5208',//十进制:21000

'gasPrice':'0x3b9aca00',//十进制1,000,000,000

'to':'0x17A98d2b11Dfb784e63337d2170e21cf5DD04631',//发送地址

'value':'0x16345785d8a0000',//100000000000000000,10^17

'data':'0x',//空数据的十进制表示

'chainId':1//区块链网络ID

})

.then(console.log)可以使用在线使用程序Composer将已签名的交易传递到以太坊网络。这种做法被称为”离线签名“。离线签名对于诸如状态通道之类的应用程序特别有用,这些通道是跟踪两个帐户之间余额的智能合约,并且在提交已签名的交易后就可以转移资金。脱机签名也是去中心化交易所(DEXes)中的一种常见做法。

也可以使用在线钱包通过以太坊账户创建签名验证和广播。

使用Portis,您可以签署交易以与加油站网络(GSN)进行交互。

链乔教育在线旗下学硕创新区块链技术工作站是中国教育部学校规划建设发展中心开展的“智慧学习工场2020-学硕创新工作站”唯一获准的“区块链技术专业”试点工作站。专业站立足为学生提供多样化成长路径,推进专业学位研究生产学研结合培养模式改革,构建应用型、复合型人才培养体系。

2021-01-19 记录一次以太坊nonce值的问题之前在做后端接口的时候,封装了构造交易及发送交易这一层,其中构造交易的时候,获取用户的nonce这里,没有自己维护,而是从链上获取,且之前由于一些业务这里没有做队列,导致前端并发调用的时候,会产生一个账户同时构造两个相同nonce值得交易,最终会导致失败一条。 

Client.PendingNonceAt 是从pending中获取该账户的本次交易改用的nonce,本以为这里已经处理了就没管,不曾想,还是会出现上面的交易重复的bug。

经修改,如果是特殊账户,可在业务层自行维护计数器做nonce值,维护成本较大,且复杂。

第二种 就是这里加个队列,毕竟及时性不是区块链该有的东西。

好了,文章到此结束,希望可以帮助到大家。

基金通道业务规模是什么?相关知识分享

港股通交易规则讲解,快来了解吧

白牡丹饼冲泡方法分享,快来了解一下吧