干货 - 以太坊上发送交易的九种办法

当前位置:首页 > 币圈百科 > 干货 - 以太坊上发送交易的九种办法

干货 - 以太坊上发送交易的九种办法

2022-11-25币圈百科493

本文的目的是为以太坊生态系统中用于发送交易的各种技术、模式和机制提供指南。随着新技术层出不穷,本文也会相应更新,所以可以认为是一种未完待续的状态。

本文将包含以下内容:

以太坊交易简介?以太坊交易简介:用气和gasToken?燃气和燃气令牌元交易的目的?元交易潜水艇发送?潜艇交易的反事实例证?反事实合同实例化零确认交易?零确认交易批量转移?基于短信的批量转账支付?基于短信重复订购支付的支付?通过Oracle contract为批量交易减少订购付款?通过Oracle contracts为批量交易保存带有一次性地址的gasmultisends?使用一次性地址进行多次支付

背景知识

以太坊是一个基于账户的系统。目前有两种账户:普通账户和合同账户。两个账户都有自己的以太坊地址、交易计数器随机数和余额。契约账户也有不可变的代码和相应的存储空间。这里有一篇介绍这些基本概念的好文章。

以太坊交易包含以下关键字段:

Nonce,或交易计数器,即该账户发起的交易次数,从0开始计算气价,这决定了该交易要支付的以太量。gas Limit,即允许处理该事务的gas的最大数量的目标地址,即接受该事务的对象。如果为空,则交易将创建新的合同交易金额,即发送的以太量数据,它可以是任意的文本消息、对合同的调用或创建新合同的代码

。请注意,上面的关键点是没有“交易发起”地址,因为这个地址可以从生成这个交易的哈希值签名的公钥-私钥对中导出,交易字段由适当的RLP(递归长度前缀)编码。

燃气用途和燃气代币

站在一个很通俗的角度。区块链可以看作是一个共享的数据库。每次从这个数据库中读取或写入数据时,都需要花费gas来防止垃圾邮件之类的恶意攻击。具体来说,在以太坊上执行的每一个计算步骤都需要耗费gas,以避免可能导致以太坊停止的恶意攻击。各操作码的气体开销在以太坊黄皮书中有解释。然而,操作代码的气体开销仍然是一个热门话题,以太坊的社区成员正在研究引入存储租金机制的可能性,甚至是气体和操作代码的动态定价方案。

在以太坊区块链写数据是昂贵的。例如,创建一个非空的存储单元需要花费20000 gas,这几乎相当于一个简单的以太传输事务的成本(即当事务结构中的数据字段为空时)(21000 gas)。作为一项缓解区块链数据存储激增的激励计划,以太坊协议将为清空不再使用的旧存储单元退还1万燃气。

乙醚的这种退款机制,最多可以退还合同交易花掉的一半的气(普通的过户交易因为已经用了最低消费的气,是拿不到退款的;但是批量调用合同可以享受这个退款机制)。燃气代币可以让开发者简单高效地利用这种退款机制,即通过燃气代币,在燃气价格低的时候囤货,然后在燃气价格高的时候花掉之前存储的燃气代币。

最近确实有交易所发现了一个没有正确设置交易气上限的漏洞。攻击方法很简单:在交易所申请提现,然后将提现交易的目标地址设置为攻击者部署的恶意契约,其默认的回退函数(向契约发送Ether会触发该函数的调用)会借机施放新的瓦斯令牌。 (校对注:详见文末超链接《深处的蚁穴》)

元交易

元交易是一种发送交易的模式:发送方先签署一个合法的以太坊交易,然后通过链式传输将交易和签名转发给一个中继。中继愿意承担交易的气体开销,最终将交易发送到以太坊网络。

11

-以太坊的技术人员都喜欢抽象——这种元交易模式很有用,因为发送方不再需要在发送账户中有以太,从用户体验的角度来看是有益的。我之前在这篇文章中提到过元交易及其对UX的影响。

元交易的最终目的地址一般是一个以太坊合同,在一定程度上,合同知道交易的签署方并不是交易的实际发送方。以太坊交易API的msg.sender字段会返回中继方的地址,但它很可能没有代表签约方操作的权限,所以在这个场景下没有太大意义(只看msg.sender字段)。所以很多元交易都是依靠链上的签名验证(通过以太坊API的ecRecover函数)来保证签名人的账户确实在一个合适的白名单中(拥有操作交易所需指令的权限)。

潜艇发

(不要和这个潜艇交易网站说话?https://submarineswaps.org/?困惑)

矿工抢注现象是基于区块链经济的交易市场中一个难以杜绝的老问题,即矿工可以重新排序自己的交易,随意插队或插队自己的交易来获利。海底交易试图通过其强大的保密性,为矿工的潜逃问题提供解决方案。不仅仅是隐藏交易金额,潜艇交易会试图完全隐藏这笔交易的存在。当然,如果一笔交易永远被隐藏起来,它将毫无意义。潜艇交易允许发送方在未来的某个时间点披露交易,这就是为什么它被称为“潜艇”交易。

12

——通过使用潜艇进行交易,用户的交易不会被挖矿者抢走——用户提交一个带有加密承诺的交易,交易中包含一些用户想发送给目标契约的应用数据,将交易中涉及的以太或令牌锁定在潜艇地址中,潜艇地址与一个全新的地址相同(因此很难被挖矿者识别)。此地址中锁定的以太网或令牌只能由目标合同解锁。通过在承诺交易中增加货币价值(除非用户完成了对承诺的披露,否则额外的货币价值实际上被烧掉了,无法收回),我们保证了一个有效的经济约束,以防止一些恶意用户选择性地披露他们的承诺(即防止用户无成本地提交任何承诺)。只要承诺的交易被成功封装并被足够多的区块确认,用户就可以向目标契约公开自己的加密承诺,然后契约(验证成功后)就会执行交易中包含的应用逻辑。

反事实契约的实例化

反事实一词源于哲学和思维中的一个概念。反事实陈述是一系列合理的推理和相应的结论,但陈述的前提是故意与事实相反。除去这个与事实不符的前提,整个推理链都是合理的,所以前提正确,最后的结论也就正确。当应用于区块链交易场景时,contract的逻辑不仅会考虑区块链的当前状态,如果部署了合同,还会考虑区块链的状态。

13

更具体地说,在部署之前获取协定的地址。这个模型被称为反事实契约实例化。这个理论由L4发表在他们的“反事实状态通道”论文中,受到以太坊社区的广泛欢迎。

目前新的契约地址是由Ethereum操作码CREATE生成的,可以通过契约创建者的账户地址(sender字段)和创建者已经发出的交易数(nonce字段)明确确定,即sender和nonce字段会经过RLP编码,然后由Keccak256哈希算法生成。

由EIP 1014推出?Skinny CREATE2?此外,操作码允许用户与链中尚不存在的地址进行交互;虽然这个地址上还没有代码,但是可以保证它只能包含一个特定初始代码生成的契约逻辑。与CREATE opcode不同,CREATE2 opcode通常使用sender-nonce,然后进行哈希运算来获得协定地址,它使用以下地址生成公式:keccak256(0xff地址盐keccak256(init_code)))[12:]?

这种模式对于涉及与尚不存在的合同进行交互的状态通道场景尤其重要。它允许以太坊主链成为争议(解决)层,不需要考虑契约部署的真实成本。同样,这种模式也可以用在已知函数将创建新地址的场景中,比如这里的贷款偿还地址。

零确认交易

零确认交易来自于?比特币现金社区目前仍是一个有趣但未经证实的研究领域。在这样的区块链网络中,块释放的时间实际上可能更不利于用户体验(UX抑制)。确认零交易的寄件人需要提交押金。如果有重复消费,寄件人会损失押金。在比特币现金中,可以通过重用UTXO的输入项来检测双花行为。任何人(一般假设是矿工)都可以提交找到的两个双花交易,然后获得押金奖励。

在以太坊的账户网络中,与使用类比特币的UTXO不同,我们可以检查同一个发送者是否重用了同一个nonce。例如,一个已部署的协定提供了一个reportDoubleSpend方法,该方法接受两个要完成的已签名事务,然后该协定将检查其发送者和nonce,如果它们相等,它将奖励方法调用方一个差额。原理很简单:如果保证金金额足够大,这是防止交易发送方作弊(重复消费)的有力武器,因为他们可能会失去支付的保证金。这种类型的交易被认为是最适合小额一次性支付的场景,因为这种场景有一系列潜在的攻击模式。

批量转移

与ERC20令牌交互的一个主要问题是,一般需要两个不同的事务:一个是调用令牌契约的approve方法,另一个是实际调用目标契约(目标契约内部会调用transferFrom方法)并使用令牌完成特定逻辑(doSomethingForTokens方法)。这种模式会导致非原子事务的一系列问题。在最简单的情况下,如果doSomethingForTokens调用事务失败,前面的approve调用将不会回滚,也就是说,approval方法允许契约所控制的令牌配额仍然有效。

14

-ERC 20令牌契约的approve和transferFrom方法是非原子Limechain?实现了一种特殊的批量传输方法。参考元事务中的链签名验证原理,失败的doSomethingForTokens调用事务将回滚相应的approve调用,从而提高了ERC20令牌的原有approve和transferFrom方法的非原子性。基于短信的

支付

CoinText?它可能是最著名的基于短信的加密货币支付服务提供商,目前专注于提供比特币现金交易。这种支付机制对于发展中国家和地区的移动设备尤其有用。Eth2?类似的技术已经部署在以太坊上,它可以通过基于移动应用(如信任)的传统以太坊钱包工作。

15

-eth2.io基于短信的加密数字支付方案——该具体方案采用托管合同。发送方生成一个临时的公钥-私钥对,然后发送给托管契约?存放在以太网中,之前生成的临时公钥附加到该传输中。私钥用随机生成的对称密钥加密,然后密文通过链外手段(e-mail、SMS、Whatsapp等)发送到集中验证服务器。). 目前,如果接收方手机号验证成功,验证服务器会将密文发送给接收方,接收方可以解密(即得到临时私钥),然后在提现交易报文上签名。然后,托管契约可以验证签名,并确认它是由临时私钥签名的。

集中式服务器用于验证手机号码和交付密钥,但Eth2的服务器无法控制托管合同中锁定的以太。如果集中式服务器被攻击,支付交易将失败,但以太仍在托管合同中。如果此时想取回锁定的以太,发送方可以通过调用托管合同取消支付。

订阅付费

基于选择退出的订阅服务付费是Web2.0时代互联网服务的主流实现方式。例如,Spotify、网飞、Headspace和Tinder都是基于订阅付费建立自己的商业收入模式。

加密货币中订阅支付的概念也不新鲜。在比特币中,nLocktime?字段可用于确保已签名的交易不会在指定的块高度之前被打包(即消费)。但在以太坊中,用于未来支付的预签名交易意义不大,因为账户的nonce会随着账户不断发出交易而增加,导致预签名使用的nonce越小,则交易无效。

幸运的是,以太坊的图灵完备性提供了一个解决方案:对于重复订阅类型的事务,有一些架构方案。这些架构在利润(流动性)、用户体验的复杂性、可选功能、气体开销和可扩展性方面有不同的权衡。基于Oracle machine的

方法调用

另一种比较特殊的事务发送方法是使用Oracle machine服务,比如Oraclize,以便通过适当的集中化来换取用气量的减少。可以看看这篇文章。

16

-使用Oraclize减少常量契约调用的gas使用量——这种类型适用于非事务性(返回常量)方法调用。已经与以太坊主网同步的节点可以通过以太坊JSON-RPC的eth_call接口调用上述方法。只要继承usingOraclize,就可以使用Oraclize的oraclize_query方法在契约中进行常量查询。此外,必须在契约中定义_ 蓑衣网小编2022 _ callback (bytes32queryid,string results)的回调函数,Oraclize query将调用该函数并保存查询结果。与调用Oraclize相比,直接在链上查询来获取和计算这些状态常数的代价可能更大。

使用一次性地址进行多次支付

如背景介绍,交易字段中没有“始发地址”。这个地址可以通过ecRecover函数来计算。那么问题来了:我们可以随意在交易签名中填写我们想要的数据吗?事实表明,一半的签名是正确的,即ecRecover仍然返回合法的公钥(因此也对应于以太坊地址)。因为我们不能控制生成的地址,所以我们传递设置字段值,其实是在构建这样一个交易:该交易可以花费看上去是一个随机生成的地址中的余额。

如果我们创建了这样一笔交易(发送方是我们想要生成的地址),并给生成的地址充值了若干Ether,那么该笔交易就可以像一般交易一样执行。这样我们实质上创建了一个一次性的地址,因为其中的余额只能被一笔交易使用。如果我们以某种可预测的方式选择交易签名中的字段值并公布该笔交易,我们就可以向任何人证明,发给交易发送方地址的金额,只能被该笔交易使用,而不能被其它任何交易使用。

17

如上图所述,该场景尝试发送交易至11140个目标地址,由一系列发送 Ether 至多个地址的交易组成,每个交易发送到 110 个地址,其中发送方的地址通过上述方法生成。对于签名字段,我们填入‘0xDA0DA0DA0…’?,这是一个可预测的值,这样我们确定,没有人能拿到这些签名所对应地址的私钥。

这蓑衣网小编2022就创建了一批拥有“一次性地址”的交易,这些地址可以用来给相应交易提供所需交易金额。但 104 个要签名的交易对于受托自然人而言还是太多了,所以我们重复一次上述过程,形成一个级联结构:我们先构造 104 笔交易,每笔交易都有其对应的唯一地址,然后再构造一笔发送 Ether到对应的 104 个地址的转账。通过验证,代码确实可以按照预期运行,那么任何人就可以这些构建好的交易发送到以太坊网络中,整个过程就像多米诺骨牌一样自动进行了:名单上的 11400 个地址都会收到 Ether,但我们仅仅用了一次人工签名。


以太坊上完成交易居然有这么多不同的方式!!!

如果有什么遗漏,请告诉我,我会时不时地更新本文。欢迎在推特上关注我:https://twitter.com/gawnieg


本文来源:以太坊爱好者Ethfans

原文链接:?https://medium.com/coinmonks/the-business-of-sending-transactions-on-ethereum-e79fd9a2b88

作者:?Aodhgan Gleeson

翻译&校对:?Ray & 阿剑

干货 - 以太坊上发送交易的九种办法 | 分享给朋友: