Solidity
除了簽名的 tx 之外,伺服器如何支付 gas 費用?
我有一份契約,使用者可以購買“積分”。
有了這個信用,使用者可以將消息發佈到伺服器(在 ExpressJS 中設置的路由)。
我有購買學分的工作。
但我的問題是伺服器上執行的程式碼如何知道使用者實際上有信用?
估計使用者..
- 簽署 tx
- 將 tx 發送到 ExpressJS 上的路由。
- 該路線呼叫提供商(如 Infura)來檢查使用者是否有信用。
- 如果他們有信用,更改契約狀態(刪除一個信用)
- 根據結果,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