Solidity
通過智能合約匯款
我正在嘗試創建一個智能合約,通過從我填寫的數組中獲取值,將資金從一個錢包發送到另一個錢包。但它不會發送值,除非我在 msg.value 中指定它們。如何在沒有使用者參與的情況下通過屬性 ID 匯款?ps:在私網
pragma solidity ^0.4.18; contract property { uint256 cad_number; address customer; struct propertyInfo{ address Owneradress; uint256 cad_number; string location; uint32 cost; bool housing_status; } mapping(uint256 => propertyInfo) propertys; mapping (address => uint) public balances; function Create_Property(address Owneradress, string memory location, uint32 cost, bool housing_status ) public{ propertyInfo storage NewProperty = propertys[cad_number]; NewProperty.Owneradress = address(Owneradress); NewProperty.location = location; NewProperty.cost = cost; NewProperty.cad_number = cad_number; NewProperty.housing_status = housing_status; cad_number++; } function Listing_property(uint256 prop_id) public view returns ( address, string memory, uint256, uint32, bool ){ propertyInfo storage s = propertys[prop_id]; return(s.Owneradress, s.location, s.cad_number, s.cost, s.housing_status); } function transaction_to_contract(uint256 _id) public payable { propertyInfo storage s = propertys[_id]; s.Owneradress.transfer(s.cost); balances[s.Owneradress] += s.cost; } }
你不能這樣做。
無法編寫直接訪問另一個使用者的錢包或另一個合約的儲存的合約。所以,你需要一種不同的方法。
考慮授予合約授權以管理一定金額的使用者。這可以包括根據規則重新分發給其他使用者。考慮一個託管契約或 ATM,它持有資金,甚至可以將資金轉移為內部會計程序。
pragma solidity 0.5.13; contract ATM { mapping(address => uint) public balances; event Deposit(address sender, uint amount); event Withdrawal(address receiver, uint amount); event Transfer(address sender, address receiver, uint amount); function deposit() public payable { emit Deposit(msg.sender, msg.value); balances[msg.sender] += msg.value; } function withdraw(uint amount) public { require(balances[msg.sender] >= amount, "Insufficient funds"); emit Withdrawal(msg.sender, amount); balances[msg.sender] -= amount; } function transfer(address receiver, uint amount) public { require(balances[msg.sender] >= amount, "Insufficient funds"); emit Transfer(msg.sender, receiver, amount); balances[msg.sender] -= amount; balances[receiver] += amount; } // In a Batch function transfer(address[] memory receivers, uint amount) public { require(balances[msg.sender] >= receivers.length * amount, "Insufficient funds"); for (uint i=0; i<receivers.length; i++) { emit Transfer(msg.sender, receivers[i], amount); balances[msg.sender] -= amount; balances[receivers[i]] += amount; } } }
當然,這是一個簡化的範例,可以為您提供一些想法。它沒有針對性能或安全性進行優化。
您可以看到合約持有資金,使用者可以在沒有警告或資格的情況下自由提取*可用資金。*這對使用者來說更好,因為他們控制了合約的權限範圍——通過明確地將資金轉移到合約的控制之下。將契約視為他們共同決定信任的自動售貨機/ATM/卡經銷商。他們把錢放在桌子上、機器裡等等,要不然契約是碰不到的。
這些
transfer
函式是應用程序應該做的任何事情的代理。在範例中,使用者來回匯款。真正的應用程序可以使用任何適當的規則集,包括批處理。可以使用相同的內部會計方法將資金投入到遊戲/交易、準備就緒時支付、處理退款等。將資金從
balances
(可提取的)轉移到其他分類賬。保持資金節約很重要,因此會計核算始終與存款資金完全匹配。
合約有效地將 ETH 從一個使用者發送到另一個使用者。
希望能幫助到你。