伺服器可以為第三方服務嗎?
我將嘗試解釋我的想法。
我們的伺服器從不同的伺服器接收要保存的數據,我們稱之為 S1、S2 和 S3。
我們的伺服器使用帶有 web3.js 的節點腳本通過合約呼叫函式。實際上,我們正在從我們的錢包中支付所有交易。
我希望能夠從我們的客戶那裡收到 eth,存入合約餘額,擁有一個餘額 x 單個地址。
這是可行的。
但是我希望我們的伺服器將花費客戶的 eth,而不是我們的 eth,來呼叫合約函式。
所以最終目標是使用者為伺服器所做的事情付費。
我的問題是使用者沒有通過瀏覽器與我們的伺服器互動,所以我們沒有元遮罩來支付費用。
有沒有辦法向第三方追加費用?
我們可以為我們的客戶打電話,我們預計成本,然後呼叫一個只有我們可以呼叫的合約函式,將一定數量的 eth 從使用者的個人餘額轉移到我們的賬戶。
我想我不能簡單地將 eth 從別人的錢包轉移到我們的錢包裡。所以我想在合約中為每個使用者創建一個餘額,接受預期的付款,並將天然氣從使用者餘額轉移到合約餘額中。
我完全確定它會以某種方式被黑客入侵。我並不完全高興。
編輯
- 我的使用者應該能夠向合約發送 ETH。此金額發送給契約,而不是契約所有者
- 當合約從使用者那裡收到 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。