以太坊上的 Dapp 一定要用户付 gas 费用么?未必
## 非对称加密
这里多唠叨两句非对称加密,如果你对此有所了解可以直接跳过此部分。
非对称加密由两部分组成:公钥和私钥。
公钥一般用来加密,公钥加密的数据只能用对应的私钥解开。
私钥一般用来签名,把私钥签名的数据和公钥公布出去,收到数据的人可以使用公钥来验证数据,通过验证,说明数据未被攥改且确实由对应私钥拥有者发出。
## 以太坊合约交易
一个以太坊交易主要由一下几部分组成:
AccountNonce:此交易的发送者已发送过的交易数
Price:此交易的gas price
GasLimit:本交易允许消耗的最大gas数量
**Recipient:交易的接收者,对合约交易来说,就是合约地址**
Amount:交易转移的以太币数量,单位是wei
**Payload:交易可以携带的数据,对于合约交易来说,就是要调用的方法名和参数**
**V R S:交易的签名数据,通过用户私钥签名交易得到**
如果是正常发送一个交易,用户就要指定 Price 和 GasLimit,然后被矿工宰上一刀,雁过拔毛。
对于 Dapp 应用来说,就存在两个问题:
1. 对于非交易类应用,比如说投票应用,用户不涉及资产交易,只是点个按钮投个票,就要收取费用,并不十分合理。
2. 对于区块链小白用户来说,只是想试用一把应用,就要去折腾购买以太坊来付费,门槛还是比较高的。不是很有利于产品推广。
## 由 Dapp 开发商来付费
[这篇文章](https://link.jianshu.com?t=https%3A%2F%2Fmedium.com%2Fblockchannel%2Fhow-to-save-your-ethereum-dapp-users-from-paying-gas-for-transactions-cfc665891ab4) 提供了一个很好的方案:由 Dapp 开发商或者合约开发者付费。
具体怎么做呢?
1. 用户将要发送的数据签名,并将源数据,签名数据发送到 Dapp 后台
2. Dapp 后台接收到用户请求,将用户发来的数据当作交易 payload 的一部分,以合约开发者的身份组装新的交易,发送到以太坊网络。
在这个阶段,交易发送者是合约开发者,相当于由合约开发者代理用户发送了这笔交易,也就不需要用户付费而是由合约开发者付费了。
3. 智能合约接收到请求,验证交易发送者确实是 contract owner, 并对用户数据进行验签操作,更改该用户在合约中的数据状态。
## 安全考量
在这个方案中,尽管用户没有把交易直接发送到以太坊网络。但是私钥还在自己手上,发送的数据都是用自己的私钥签名的数据,可以保证数据在传输过程中不被伪造和攥改。
如果你感觉那地方还有啥不妥,欢迎留言讨论。
对以太坊稍微了解一些的同学应该知道,往以太坊区块链上发送的每一笔交易,都需要付一定数量的油费(gas fee),以太坊矿工也是根据油价(gas price)排序去打包交易。对于转账操作来说,转账时支付一定的手续费基本还能接受;对于 Dapp 应用来说,每点一个按钮都要支付手续费似乎有点儿不太适宜了。
那么,有没有一种办法,让用户既能完成链上操作,有不需要支付手续费呢?
不瞒您说,还真有!
非对称加密
这里多唠叨两句非对称加密,如果你对此有所了解可以直接跳过此部分。
非对称加密由两部分组成:公钥和私钥。 公钥一般用来加密,公钥加密的数据只能用对应的私钥解开。 私钥一般用来签名,把私钥签名的数据和公钥公布出去,收到数据的人可以使用公钥来验证数据,通过验证,说明数据未被攥改且确实由对应私钥拥有者发出。
以太坊合约交易
一个以太坊交易主要由一下几部分组成: AccountNonce:此交易的发送者已发送过的交易数 Price:此交易的gas price GasLimit:本交易允许消耗的最大gas数量 Recipient:交易的接收者,对合约交易来说,就是合约地址 Amount:交易转移的以太币数量,单位是wei Payload:交易可以携带的数据,对于合约交易来说,就是要调用的方法名和参数 V R S:交易的签名数据,通过用户私钥签名交易得到
如果是正常发送一个交易,用户就要指定 Price 和 GasLimit,然后被矿工宰上一刀,雁过拔毛。
对于 Dapp 应用来说,就存在两个问题:
- 对于非交易类应用,比如说投票应用,用户不涉及资产交易,只是点个按钮投个票,就要收取费用,并不十分合理。
- 对于区块链小白用户来说,只是想试用一把应用,就要去折腾购买以太坊来付费,门槛还是比较高的。不是很有利于产品推广。
由 Dapp 开发商来付费
这篇文章 提供了一个很好的方案:由 Dapp 开发商或者合约开发者付费。 具体怎么做呢?
-
用户将要发送的数据签名,并将源数据,签名数据发送到 Dapp 后台
-
Dapp 后台接收到用户请求,将用户发来的数据当作交易 payload 的一部分,以合约开发者的身份组装新的交易,发送到以太坊网络。 在这个阶段,交易发送者是合约开发者,相当于由合约开发者代理用户发送了这笔交易,也就不需要用户付费而是由合约开发者付费了。
-
智能合约接收到请求,验证交易发送者确实是 contract owner, 并对用户数据进行验签操作,更改该用户在合约中的数据状态。
安全考量
在这个方案中,尽管用户没有把交易直接发送到以太坊网络。但是私钥还在自己手上,发送的数据都是用自己的私钥签名的数据,可以保证数据在传输过程中不被伪造和攥改。
如果你感觉那地方还有啥不妥,欢迎留言讨论。
- 发表于 2018-04-21 06:45
- 阅读 ( 3373 )
- 学分 ( 6 )
- 分类:DApp