以太坊学习-以太坊账户、交易(一)

一、外部账户EOA

外部账户(用户账户/普通账户)

       有对应的以太币余额

       可发送交易(转币或触发合约)

       由用户私钥控制

       没有关联代码

二、合约账户

内部账户

       对应的以太币约

       由关联代码

       由代码控制

       可通过交易或来自其他合约的调用进行代码执行

       执行代码可以操作自己的存储空间,也可以调用其他合约

扫描二维码关注公众号,回复: 10060333 查看本文章

三、以太坊交易

签名的数据包,由EOA发送到另一个账户

       消息的接收方地址

       发送方签名

       金额

       数据

       START GAS

       GAS PRICE

消息

合约可以向其他合约发送消息,消息只存在于EVM中

可以看作函数调用

      消息发送方

      消息接收方

      金额

      数据

      START GAS

合约

可以读写自己的内部存储

可想其他合约发送消息,依次触发执行

一旦合约运行结束,并且由它发送的消息触发的所有子执行结束,EVM就会中止运行,直到下次交易被唤醒

     合约应用一

     维护一个数据存储,存储对其他合约或外部世界有用的内容

     最典型的例子是模拟货币的合约

      合约应用二

     通过合约实现一种具有更复杂访问策略的EOA,一个人可以拥有一份转发合约,该合约会等待直到给定三个私钥中的两个确认后,再重新发送特定信息

      钱包合约是这类应用中很好的例子

       合约应用三

      管理多个用户之间的持续合同或关系

      这方面的例子包括金融合同,以及某些特定的托管合同或某种保险

交易本质

    交易是由外部拥有的账户发起的签名消息,由以太坊网络传输,并被序列化后记录再以太坊区块链上。

    交易时唯一可以触发状态更改或导致合约再EVM中执行的事物

    以太坊时一个全局单例状态机,交易时唯一可以改变其状态的东西

    合约不是自己运行的,以太坊也不会“在后台”运行。以太坊上的一切变化都始于交易。

交易数据结构

    nonce:由发起人EOA发出的序列号,用于防止交易消息重播

                 不会明确存储为区块链中账户状态的一部分。相反,它时通过计算发送地址的已确认交易的数量来动态计算的。

                 防止错误计算账户约,强制来自任何地址的交易按顺序处理,没有间隔,无论节点接收它们的顺序如何

                 确保所有节点计算相同的余额和正确的序列交易,防止“双花”。

                 并发和nonce:

                           以太坊允许操作(节点,客户端,DApps)并发的系统,但强制执行单例状态。

                           如何设置nonce?

                           队列的方案,依然会产生中心化,能否采用分布式id的生成方式

    gas price:交易发起人愿意支付的gas单价

    start gas:交易发起人愿意支付的最大gas量

    to:目的以太坊地址

    value:要发送得到目的地的以太数量

    data:可变长度二进制数据负载

    v,r,s:  发起人EOA的ECDSA签名的三个组成部分

    交易消息的结构使用递归长度前缀编码方案进行序列化,该方案专为在以太坊中准备却和字节完美的数据序列化而创建

交易Gas

gas是交易发起人需要为EVM上每项操作支付的成本名称。我们要从执行代码的矿工那里用以太币购买gas。

gas对应算力自然成本,以太币是虚拟产生的。gas价格需要和以太币确认,调整方式由矿工和卖币方确定的。

gas的计算

      发起交易时的gas limit并不是要支付的gas数量,而只是给定了一个消耗gas的上限,相当于“押金”

      实际支付的gas数量时执行过程中消耗的gas,gas limit中剩余的部分会返回给发送人

      最终支付的gas费用时gasUsed对应的以太币费用,单价由设定的gasPrice而定

      最终支付费用totalCost = gasPrice*gasUsed

      totalCost会作为交易手续费支付给矿工

估算交易gas

      使用geth中eth.estimateGas方法,手续费和value没太大关系。与交易体大小有关

eth.estimateGas({from:""0xfsafdfsadf.......fsdaff,to:"0xfasf....dfafasa",value:10000})

  

交易的接收者(to)

交易接收者在to字段中指定,是一个20字节的以太坊地址。地址可以是EOA或合约地址。

以太坊没有进一步的验证,任何20字节的值都被认为是有效的。如果20字节值对应于没有相应私钥的地址,或不存在的合约,则该交易仍然有效。以太坊无法直到地址是否是从公钥正确派生的

如果将交易发送到无效地址,将销毁发送的以太,使其永远无法访问。

验证接收人地址是否有效的工作,应该在用户界面一层完成。

交易的value和data

交易的主要“有效负载”包含在两个字段中:value和data。交易可以同时由value和data

value的交易是以太的付款

data交易一般是合约的调用

合约调用的同时,我们除了data之外还可以发送以太,从而交易中同时包含data和value

没有value也没有data的交易,只是在浪费gas,但它是有效的

向EOA或合约传递data

当交易包含数据有效负载时,它很可能是发送到合约地址的,但它同样可以发送给EOA

如果发送data给EOA,数据负载的解释取决于钱包

如果发送数据负载给合约地址,EVM会解释为函数调用,从payload里解码出函数名称和参数,调用该函数并传入参数

发送给合约的数据有效负载时32字节的十六进制序列化编码

       函数选择器:函数原型的Keccak256哈希的前4个字节。这允许EVM明确地识别将要调用的函数

特殊交易:创建(部署)合约

有一种特殊的交易,具有数据负载且没有value,那就是一个创建新合约的交易

合约创建交易被发送到特殊目的地地址。该地址既不代表EOA也不代表合约。它永远不会花费以太或发起交易,它仅用坐目的地,具有特殊含义“创建合约”。

虽然零地址仅用于合约注册,但它有时会收到来自各种地址的付款。这种情况要么是偶然误操作,导致失去以太;要么是故意销毁以太。

合约注册交易不应包含以太值,只包含合约的已编译字节码的数据有效负载。此交易的唯一效果是注册合约。

发布了11 篇原创文章 · 获赞 5 · 访问量 5733

猜你喜欢

转载自blog.csdn.net/u010471976/article/details/105012177