Design-Patterns

伺服器可以為第三方服務嗎?

  • January 27, 2020

我將嘗試解釋我的想法。

我們的伺服器從不同的伺服器接收要保存的數據,我們稱之為 S1、S2 和 S3。

我們的伺服器使用帶有 web3.js 的節點腳本通過合約呼叫函式。實際上,我們正​​在從我們的錢包中支付所有交易。

我希望能夠從我們的客戶那裡收到 eth,存入合約餘額,擁有一個餘額 x 單個地址。

這是可行的。

但是我希望我們的伺服器將花費客戶的 eth,而不是我們的 eth,來呼叫合約函式。

所以最終目標是使用者為伺服器所做的事情付費。

我的問題是使用者沒有通過瀏覽器與我們的伺服器互動,所以我們沒有元遮罩來支付費用。

有沒有辦法向第三方追加費用?

我們可以為我們的客戶打電話,我們預計成本,然後呼叫一個只有我們可以呼叫的合約函式,將一定數量的 eth 從使用者的個人餘額轉移到我們的賬戶。

我想我不能簡單地將 eth 從別人的錢包轉移到我們的錢包裡。所以我想在合約中為每個使用者創建一個餘額,接受預期的付款,並將天然氣從使用者餘額轉移到合約餘額中。

我完全確定它會以某種方式被黑客入侵。我並不完全高興。

編輯

  1. 我的使用者應該能夠向合約發送 ETH。此金額發送給契約,而不是契約所有者
  2. 當合約從使用者那裡收到 eth 時,合約會執行類似的操作

balance[msg.sender] += msg.value 3. 作為初始付款的一部分,使用者將無法以任何方式直接與合約進行互動。

編輯2:可能我找到了一個實際的例子

想像一下,我們就像一家銀行。

您,使用者,將錢轉入您的銀行帳戶。銀行,我們的合約,其實知道你擁有的總金額。

但如果你的銀行賬戶有足夠的錢,銀行就會支付你的賬單。

您最初將錢匯入您的銀行賬戶,但銀行會在沒有您干預的情況下花掉您的錢。

因此,將 eth 發送到我的契約中,使用者允許我花費他們發送的東西。

你只需要以這樣的方式編寫你的智能合約,它會改變使用者餘額並收取費用並將這筆費用發送給你以補償 gas 成本。像這樣的東西:

uint public constant FEE = 123;
mapping (address => uint) public userBalances;

function doSomethingForUser (address user, ...) public onlyowner {
 // Do something useful for user

 uint userBalance = userBalances [user];
 require (userBalance >= FEE);
 userBalances [user] = userBalance - FEE;
 msg.sender.transfer (FEE);
}

在此範例中,FEE 金額是靜態的。您可能會依賴於 gas 價格(可用於智能合約,tx.gasprice但這將允許您通過指定高得離譜的 gas 價格向使用者收取任意大筆費用。

此外,您嘗試通過計算gasleft()函式開頭和結尾返回的值之間的差異來估計交易的實際氣體使用量,並使用此估計來計算 FEE。

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