新手学习以太坊相关知识,如果有问题或建议,请在gzh留言。[互联网去中心化小白手册]
上一节了解了钱包生成的基础流程,这节主要介绍一下交易相关的内容,交易内容很多需要分成几个部分来阐述。
交易是由外部账户发出的经过签名的消息,通过以太坊的网络传播,由矿工记录在区块链上。从另一个角度来看,交易时唯一能够触发区块链状态改变,或触发EVM上的合约执行的东西。以太坊是一个全局的单体状态机,交易是唯一能够让这台状态机向前推进并改变状态的东西。合约并不会自动运行,以太坊也不会在“后台”运行。所有的这一切都是交易触发的。
1 交易的结构
来看一下交易在以太坊网络上打包和传输的基本结构。每个以太坊客户端或应用程序收到这个打包的交易后都会把它保存在内存里,并且使用应用内部的格式。只有网络上传输的交易数据包的格式才是唯一通用标准的交易格式。
下面是使用Geth执行端,Pysrm共识端创建的Clef钱包展示的交易结构
{
"type": "0x2",
"chainId": "0xaa36a7",
"nonce": "0x0",
"to": "0xa68ceb448570c7052b7645e64dea75808b2b0567",
"gas": "0x5208",
"gasPrice": null,
"maxPriorityFeePerGas": "0x37cbe6a",
"maxFeePerGas": "0x9b450dc",
"value": "0xb1a2bc2ec50000",
"input": "0x",
"accessList": [],
"v": "0x1",
"r": "0x892fb562df150465d6f0f7d557cdf7644e6277aa72ac3628d2e122a04560e96d",
"s": "0x3fdbecfce9ef463a361a00b60e8b8c50769e68b6f9e1243240da5daae26ecd25",
"yParity": "0x1",
"hash": "0x4e6140087a68f7486d854b1463bc064aedd1bd7bf3ca8e5c6e48eb3c086e3635"
}
type:"0x2" 表示这是一个 EIP-1559 类型的交易。EIP-1559 是以太坊 2.0 升级后引入的新的交易模型,采用了“基础费用 + 小费”机制。
chainId: "0xaa36a7":这个值表示链 ID,0xaa36a7 是一个十六进制值,代表特定的以太坊网络。转换为十进制后,它等于 10997383,通常用于标识网络(例如,主网、测试网等)。
nonce: "0x0" 交易的序号,从 0 开始,表示发送方账户已发送的交易数。这里是 0x0,即这是该账户的第一个交易。一个序列编号,由构建这个交易的外部账号提供,用于防止交易的重放攻击。
gasPrice: null对于 EIP-1559 类型的交易,gasPrice 字段不再使用,取而代之的是 maxFeePerGas 和 maxPriorityFeePerGas。表示交易法启发愿意支付的gas(单位wei)价格。
gas limit:交易发起方愿意为这个交易支付的最大gas数量。
value:发送给目标地址的以太币的数量
v,r,s:构建交易的外部账户提供的椭圆曲线签名的三个组成部分,后续解释。
还有hash,accessList,yParity,maxPriorityFeePerGas和maxFeePerGas等结构。
交易内容的结构采用递归⻓度前缀(RLP)编码标准。这个标准是为以太坊专门创建的,主要是为了打包准确且字节合适的数据。以太坊交易中所有的数字都采用大端模式编码,⻓度都是8比特的倍数
递归长度前缀(RLP,Recursive Length Prefix)编码,RLP 是一种简单的编码方法,用于将各种数据结构(如字符串、数组、数字等)转换为字节流。它的主要特点是递归性和长度前缀。
大端模式(Big Endian)是一种字节序(Byte Order)的表示方式,用来指定多字节数据如何在计算机内存中排列。在大端模式中,数据的高位字节存放在内存的低地址处,而低位字节存放在高地址处。
2 交易的随机数
nonce是交易中最重要却最难理解的一个概念。nonce:一个数值,等于这个地址发出的交易数量,当这个地址与合约关联时,是这个地址所创建的合约数量。
nonce是发起方地址的一个属性。包含在交易创建顺序中的可用性特征,以及交易重复保护的重要特征。
保持对随机数的追踪
nonce就是对发起交易那个地址目前位置所有确认链上交易的计数器。可以通过控制命令台来访问JavaScript web3库
web3.eth.getTransactionCount("0x3c8b5ec601c290390a66b705bc2da15f6517fa76")
nonce是从0开始计数的,外部地址的第一笔交易的nonce是0.交易中的nonce值只有在以太坊网络确认之前nonce才会被记入getTransactionCounts的返回值中。
3 交易的gas
gas在后续中详细讨论,这里介绍gasPrice和gasLimit两个概念,后续有的概念更改了。
gas就是以太坊的燃料,gas并不是以太币,它是一种独立的虚拟货币,跟以太币之间存在汇率关系。以太坊使用gas来控制交易对资源的使用,避免拒绝服务式攻击或过度消耗资源的交易。
gas价格的计量单位是wei/gas,钱包中gasPrice设定为3gwei,也可以在网站中查看gas当前兑换价格etherscan.io/gastracker .
简单的以太坊转账,从一个外部账户转移到另一个外部账户,所需要的gas数量是固定21000单位个gas。如果你的交易目标是一个合约,那么需要的gas数量可以估计,但是很难精确算出。这是因为合约可以根据不同的初始条件选择不同的执行路径,这样会导致不同的gas开销。这意味着合约可能只执行一个简单的计算,也可能是更复杂的计算,这些可能取决于一些你所无法控制或预判的外部因素。
4 交易的接收方
以太坊不会进一步验证这个地址。任何一个20字节的值都会被认为是正确的。如果这20字节的值对应的是一个没有私钥的地址,或者没有 对应的合约,这个交易仍旧是合法的。以太坊无法判断这个地址是否是从已知的公钥衍而来的。
向一个错误的地址发送交易可能会导致以太币被销毁,使其永远无法被访问(不可被花费),这是因为大部分地址没有已知的私钥,也就 无法生成签名去使用它。
钱包是任何面向用户的区块链应用的基础,一定要保护好自己的钱包!!!
5 致谢
- ETH 《精通以太坊》[1]
- 以太坊官网 密码学[2]
参考资料
[1]ethereum_book: https://github.com/inoutcode/ethereum_book/tree/master?tab=readme-ov-file
[2]以太坊官网: https://ethereum.org
本文使用 markdown.com.cn 排版