精通以太坊——交易(下)

 

 

(1)关于gaslimit  

gaslimit  更像是一个加油站的信用账号,可以在旅程结束后基于实际的gas开销进行支付。 

验证交易的第一个步骤就是确保发起交易的账户中有足够的以太币来支付对应的gas费用(gasprice*gas)。但是这时并不会从账户中直接扣除gas,而是直到交易执行结束后才会扣除。交易执行所实际发生的gas会被扣除,但账户中的以太币数量必须高于你在交易中指定的最高gas费用。

 

(2)关于交易接收方

以太坊不会验证接收方地址的正确性,如果向一个没有对应私钥的地址发送以太币,这相当于销毁以太币。接收方地址的验证工作需要在用户应用这一层来完成(EIP-55)。

 

(3)交易中的value和data

交易数据包的两个核心字段是:value 和 data,只包含value 的交易是支付,只包含data的交易是针对合约的调用。既没有value也没有data的交易是浪费gas。

web3.eth.sendTransaction({ from:src, to: dst, value: web3.toWei(0.01,"ethter"), data:""});    

web3.eth.sendTransaction({ from:src, to: dst, value: 0, data:"0x1234"});    

 

(4)向外部账户和合约转账的交易

当构建的以太坊交易中包含value,交易的行为模式取决于你的目的地址是另外一个账户,还是一个合约。

对于外部账户,或者任何在区块上没有注册为合约的地址,以太坊会记录这一次状态的变化,在目的账户余额中增加你所指定的以太币。如果这个地址之前不存在,那么以太坊会在区块链中创建这个地址,把它的余额初始化为你在支付交易中指定的value值。

如果目标地址是一个合约,EVM会执行这个合约,并尝试调用在交易的data字段中指定的函数。

如果交易的data字段是空的,那么EVM会指定目标合约的回退函数。如果该回退函数是可支付的,可根据函数的代码来决定下一步的执行动作。如果没有回退函数,那么交易的效果就是增加合约的余额,如同向钱包支付一样。

 

(5)向外部账户和合约传送数据的交易

当交易的data字段含有内容时,多数情况下这个交易的目标是一个合约。

大部分钱包软件会忽略针对外部账户交易中包含在data字段中的内容。在将来,也许会有一些标准来规范化钱包软件中如何使用交易中包含在data字段中的内容,这样也许肯那个允许用户调用运行在用户钱包内部的函数。

但,非常重要的一点区别在于,外部账户对于data内容的解读和使用,都不属于一太坊坊区块链共识的一部分,这是完全不同于合约执行的。

 

发送给合约的data字段的内容是通过十六进制编码的

(1)函数选择器

            被调函数原型的Keccak-256哈希值的前4个字节。这允许EVM准确无误的识别被调函数

(2)函数参数

函数的参数,根据EVM多种实现规则定义的编码结构。

 

(6)特殊交易:合约的创建

创建新合约交易的目的地址是一个特殊的地址——零地址。简单地说,合约注册交易的to字段包含的是0x0(这个地址)。

合约注册交易中唯一需要是在data字段中包含经过编译的合约字节码。这个交易的唯一用处就是把合约注册到以太坊区块链上。

(7)数字签名

数字签名有三个作用:第一个用来证明签名方是私钥的持有人。第二、证明授权是不可否认的。第三,用于确保交易数据在经过签名之后没有也不能被任何人修改。

以太坊中对某个交易的签名,实际上是指“对采用RLP编码的交易数据包的Keccak-256哈希值”进行签名。

在以太坊中签名一个交易,发起方需要:

1、生成一个交易数据包,包括9个字段:nonce、gasPrice、gasLimit、to、value、data、chainID、O、0

2、把交易数据包进行RLP编码

3、计算这个交易的Keccak-256哈希值

4、计算ECDSA签名,使用交易发起方的私钥进行签名

5、在交易中插入经过ECDSA签名获得的v、r和s的值

(8)使用 EIP-155创建原生交易

EIP-155——简单重放攻击保护,制定了带有重放攻击保护能力的交易的编码格式,这个标准再交易签名之前包含了一个链ID,确保在一个以太坊区块链(如以太坊主网)上创建的交易在其他以太坊区块链(如以太坊经典或Ropsten测试网)上是不合法的。因此,在一个网络上不能被重放到另一个网络。

(8)离线签名

 由于用于签名的计算机必须保存外部账户的私钥,而用于广播交易的计算机必须连接到互联网上,并且运行以太坊客户端。如果是两个操作在一台计算机上完成,那么就相当于把私钥放置在一台联网的计算机上,这是非常危险的。把交易的签名和广播分开处理的做法成为离线签名。

很多情况下完全空气隔离的系统是不可用的,但是即使是一定程度的隔离,也会带来极大的安全优势。例如,一个在防火墙之后的专用子网,只允许消息队列协议通过,这相比在网上系统处理签名而言,攻击面更小,更安全。很多公司在交易签名计算机上使用zeroMQ(0MQ)消息队列。使用这样的设置,交易通过消息队列完成签名。

消息队列协议采用类似TCP数据包的方式把交易数据包发给签名计算机。签名计算机从消息队列中读取交易数据包,使用恰当的密钥对交易进行签名,然后把签名之后的交易数据包发回给回复消息队列。这个回复消息队列截止把交易发送给代用以太坊客户端的联网计算机,进行交易广播。

(9)交易的传播

以太坊节点大约维护了至少13个跟它直接相连的其他节点,成为邻居。每个邻居节点都会在收到交易数据包后立刻进行验证。如果确认交易数据包是合法的,这些节点会保留一份交易副本,然后把交易数据包广播给与它们相连的邻居。因此,交易就像是水中的波纹一样,在整个网络中迅速传播开,直到所有的节点都收到一份交易的副本。节点可以对所广播的消息进行过滤,但默认情况下节点会广播收到的所有验证消息。

 

 

 

 

 

posted on 2020-02-12 16:14  ccbupt  阅读(813)  评论(0编辑  收藏  举报

导航