Solidity

除了簽名的 tx 之外,伺服器如何支付 gas 費用?

  • December 18, 2020

我有一份契約,使用者可以購買“積分”。

有了這個信用,使用者可以將消息發佈到伺服器(在 ExpressJS 中設置的路由)。

我有購買學分的工作。

但我的問題是伺服器上執行的程式碼如何知道使用者實際上有信用?

估計使用者..

  1. 簽署 tx
  2. 將 tx 發送到 ExpressJS 上的路由。
  3. 該路線呼叫提供商(如 Infura)來檢查使用者是否有信用。
  4. 如果他們有信用,更改契約狀態(刪除一個信用)
  5. 根據結果,ExpressJS 程式碼允許使用者發帖或不發帖。

問題 1 最令人困惑的部分是使用者(客戶端)如何簽署交易,而不是將其發送給提供者——而是將 tx 發佈到 Express JS/伺服器。這是如何實現的?

問題2 我想為使用者支付gas。我將如何接收客戶端簽名的 tx(有必要證明使用者是他們的真實身份——檢查他們的信用)。但同時,支付汽油。

這是否意味著我在伺服器環境中需要一個“簽名者”(帶有可用的私鑰)?這將如何工作?

這是正確的方法嗎?任何關於此主題的指針、文章等將不勝感激!

問題一:

對於您的第一個問題,可以在客戶端簽署交易並將其從您的伺服器發送給提供商。您必須呼叫 web3.js 方法 sendSignedTransaction 將交易發送到區塊鏈。

客戶端

var privateKey = new Buffer('e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', 'hex')

var rawTx = {
 nonce: '0x00',
 gasPrice: '0x09184e72a000',
 gasLimit: '0x2710',
 to: '0x0000000000000000000000000000000000000000',
 value: '0x00',
 data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057'
}

var tx = new Tx(rawTx);
tx.sign(privateKey);

var serializedTx = tx.serialize();

將此 serializedTx 發送到伺服器。

伺服器端

web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'))
.on('receipt', console.log);

請參考 web3.js 的文件:https ://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sendsignedtransaction

問題 2: 您嘗試做的基本上是無氣體交易。您可以查看 Openzepplin 的加油站網路。我想它會解決你的問題。本質上,它將交易發送到網路,而使用者無需支付費用。

請通讀。我相信它會回答你的問題:https ://docs.openzeppelin.com/learn/sending-gasless-transactions

引用自:https://ethereum.stackexchange.com/questions/91248