檢查是否允許提現
我正在嘗試概念化如何編寫特定類型的智能合約。
該合約基本上將處理 ETH 或某種 ERC20 代幣的存款和取款。
然後餘額將用於玩各種脫鏈遊戲,主要是多玩家賭場風格的東西,如德州撲克。這些遊戲是脫鏈的,因為它們需要大量操作,而且 Tx 費用對使用者不友好。
使用者會通過玩這些遊戲來增加(或減少)他們在合約內的餘額。
我想讓使用者能夠隨時將餘額提取回他們的錢包,但我必須能夠檢查遊戲伺服器以確保他們在嘗試提取時目前不在遊戲中。
我試圖防止出現這樣一種情況:玩家進入遊戲(如撲克)將他們的餘額從鏈上押注,但在遊戲進行時將其從合約中撤回。然後,如果他們輸了,就沒有餘額可以轉移給其他玩家。
我不確定這樣做的正確方法是什麼?無論如何創建代幣/自定義錢包或 oraclizing 提款有幫助嗎?
任何見解將不勝感激!
謝謝你
您可以將提款鎖定一個小時,並要求支付保證金。如果您可以證明使用者仍在通過狀態通道的簽名進行遊戲,您可以證明他們惡意地嘗試退出並要求他們的提款和保證金。
你玩的是鏈下游戲,所以遊戲伺服器中有一個信任元素。您有獨立的資金在發揮作用,與可以自由提取的資金(未支配)分開。
一個簡單的公式是將資金轉移到遊戲系統和會計過程中,直到資金從現場比賽中取出並可供提取。
如果不清楚。
愛麗絲有 10 個乙太幣。她用 5 個乙太幣購買了 5 個籌碼,並且她有 5 個乙太幣可供提取。當籌碼不在遊戲中時,她將籌碼兌現,但這是遊戲伺服器的問題,因為它知道哪些籌碼是“自由且清晰的”,哪些籌碼在遊戲中。當愛麗絲賣出 7 個籌碼(幸運的愛麗絲)時,她得到 7 個乙太幣。
合約可以處理乙太幣的存取。它可以通過帶走乙太幣(轉移給所有者)並發出事件來處理籌碼交易。遊戲伺服器有責任向她提供賭場籌碼。合約只會發出一個事件,所以它知道它應該做什麼。
同樣,當 Alice 兌現她的籌碼時,遊戲伺服器會將籌碼拿走,並將相應數量的乙太幣轉入 Alice 的賬戶。Alice 可以提取乙太幣以退出該機構。
這是一個公認的過於簡化的例子,可以給你一些想法。
pragma solidity 0.5.1; contract Holdem { mapping(address => uint) public balances; event LogDeposit(address sender, uint amount); event LogWithdrawal(address receiver, uint amount); event LogTransfer(address sender, address receiver, uint amount); function depost() public payable { balances[msg.sender] += msg.value; emit LogDeposit(msg.sender, msg.value); } function withdraw(uint amount) public { uint bal = balances[msg.sender]; require(bal >= amount, "Insufficient Funds."); balances[msg.sender] -= amount; emit LogWithdrawal(msg.sender, amount); msg.sender.transfer(amount); } function transfer(uint amount, address receiver) public { uint bal = balances[msg.sender]; require(bal >= amount, "Insufficient Funds."); balances[msg.sender] -= amount; balances[receiver] += amount; emit LogTransfer(msg.sender, receiver, amount); } }
該
transfer()
功能讓愛麗絲給房子,讓房子給愛麗絲。它發出一個足以讓誠實的房子來說明收到的資金的事件。精明的觀察者會注意到,沒有什麼能阻止房子提取獎金(在誠實的情況下)或一切(在退出騙局的情況下)。在這種系統的“鏈下”部分值得信賴之前,人們需要對房子提取資金的能力(籌碼應該被抵押)加上嚴格的限制,並證明遊戲是公平的。
希望能幫助到你。