欢迎各位的到来,匿名科技专业开发区块链项目,为您定制专业的区块链解决方案!
当前位置: > 技术文档 > 正文

基于以太坊发送交易的8种方式

2019-02-22 16:01:09 技术文档

以太坊账户目前主要分为两种,即普通账户、合约账户。这两种账户几乎没有太大的区别都有自己的以太坊地址、交易计数器 Nonce 和余额,唯一的不同之处在于合约账户除了以上提到的东西之外还额外拥有不可变的代码以及相应的存储空间。

以太坊交易涉及敏感词汇简介

Nonce:类似交易计数器,即该账户主动发起的交易数量,从0开始计数;

gas Price:决定了该笔交易需要支付的以太币数量;

gas Limit:处理该交易所允许的最大 gas 数量;

目标地址:接受该笔交易的对象,如为空,则该交易会创建一个新的合约

交易金额:即发送的 Ether 数量;

数据:可以是任意的一条文本消息,也可以是某合约的一次调用或者创建新合约的一段代码;

需要注意的是,以上词汇没有“交易发起”地址,因为该地址可以从生成该笔交易哈希值签名的公钥私钥对推导出来。

gas用途

gas通俗的来理解就是你在玩游戏时,你每使用一次技能就会消耗一定的蓝,gas就类似游戏中的“蓝”。在以太坊上有一个EVM(以太坊虚拟机)的代码运行环境,在链上执行写入命令时,网络中的每个全节点都会进行相同的计算并存储相同的值,这种执行的消耗很大,为了减少不必要的消耗,就植入了gas这个概念,每执行一个写入命令,就要支付一定的费用,费用的多少以gas的消耗程度来计算,不同的命令消耗gas的多少也不同。例如PUSH操作需要消耗3个gas,一次转账一般要消耗21000gas,gas用ETH支付。需要注意的是无论执行的命令是否成功,都需要支付计算费用。

以太坊发送交易的8种方式

1.元交易

元交易的发送模式是发送者对以太坊加破译进行数字签名,然后把该交易和签名通过链下传递的方式转交给一个中继方,该中继方愿意承担该笔交易的 gas 开销并最终发送交易到以太坊网络中。这种模式最突出的特点是发送方不需要承担gas 开销,在发送的账户中也不需要存有以太币。

2.潜艇交易

这种交易模式主要针对矿工抢跑(frontruning)问题,矿工可以对交易进行从新排序,随意裁剪或者让他们自己的交易插队来获利。利用潜艇交易模式可以有效解决该问题。潜艇交易可以隐藏交易金额,甚至完全隐藏这笔交易的存在,这就意味着矿工发现不了这笔交易,也无法知道交易金额。而且这种交易模式允许发送方在未来的某个时刻公开这笔交易,毕竟一笔交易永久被隐藏着就没什么奖励机制存在,也就失去了意义。“潜艇”交易的命名就由此而来。

3.反事实合约实例化

这种模式在合约部署之前就获取了它的地址,说得再明白点就是对于尚不存在的合约进行交互。这个合约地址由以太坊操作码 CREATE 生成,并可通过合约的创建者账户地址(sender字段)以及创建者已经发出去的交易数量(nonce字段)来明确决定,即 sender 和 nonce 字段会通过 RLP 编码然后经过 Keccak256 哈希算法生成新的合约地址。这种交易模式,不需要考虑合约部署的真实开销,深受以太坊社区的广泛欢迎。

4.零确认交易

这种交易模式主要针对小额一次性的单笔支付场景。零确认,从字面意思上就是不需要确认,但是发送方必须提交一定金额的保证金,用于矿工奖励。主要原理就是同一发送方不可重用了同一个 nonce,如果重复使用了

同一个 nonce就造成了双花行为,该行为会使发送方失掉保证金,这个保证金就被发送这个双花行为监测的矿工得到了。

5.批量转账

这种交易模式是针对ERC20 代币交互,这种交互在通常情况需要两次不同的交易:一次是调用代币合约的 approve 方法,另一次才是真正调用目标合约使用代币完成特定逻辑。这就产生了非原子性交易的一系列问题,最常见的情况就是如果调用交易失败了,之前的 approve 调用不会回滚,即 approve 方法允许合约支配的代币额度仍然成立。批量转账,借鉴元交易中的链上签名校验原理,失败的调用交易会回滚相应的approve调用,从而改善了ERC20 代币原本 approve 和 transferFrom 方法的非原子性。

6.基于短信付款

这种付款机制对于发展中国家和地区的移动设备尤其有用。Eth2 也已经在以太坊上部署了类似的技术,它可以通过传统的基于移动应用的以太坊钱包(比如 Trust)来工作。

这个特定方案采用了一个托管合约。交易发送方生成一个临时的公私钥对,然后往托管合约 存入以太币,该笔转账中附带之前生成的临时公钥。私钥则通过随机生成的对称密钥加密,然后密文通过链下方式(邮件,短信,Whatsapp 等)发送给某个中心化的校验服务器。提现时,如果接收方手机号码校验成功,校验服务器就会把密文发给接收方,接收方可以解密(即拿到临时私钥),然后对提现交易消息签名,托管合约随后可以对该签名进行校验,确认是由临时私钥完成的签名。

中心化服务器用来对手机号做验证并传递秘钥,但是 Eth2 的服务器无法控制锁定在托管合约中的 Ether。如果中心化服务器被攻击了,付款交易会失败,但是 Ether 仍在托管合约中。如果此时想拿回锁定的以太币,发送方可以通过调用托管合约取消该笔付款。

7.基于预言机的方法调用

这种方式可以减少合约调用的 gas 使用量,适用于状态常量查询。只要继承了 usingOraclize,在你的合约中就可以使用 Oraclize 的 oraclize_query 方法进行常量查询。另外,你的合约里面还必须定义一个 __callback(bytes32 queryId, string results) 的回调函数,Oraclize 查询会调用该函数并保存查询结果。

8.使用一次性地址进行多笔付款

交易字段中并没有“发起地址”,因为这个址可以通过 ecRecover 函数计算得出。交易签名字段我们可以任意填入我们想要的一半数据,这也就意味着有一半的签名是正确的,即 ecRecover 仍然返回一个合法的公钥(因此也对应着以太坊地址)。由于我们无法控制生成的地址,那么我们通过设置字段值,其实是在构建这样一个交易:该交易可以花费看上去是一个随机生成的地址中的余额,这个余额可以通过给生成的地址充值了若干以太币获得。这样就创建了一个地址,就可以进行交易了。

以上就是本文的所有内容。