Solidity

通過智能合約匯款

  • November 25, 2019

我正在嘗試創建一個智能合約,通過從我填寫的數組中獲取值,將資金從一個錢包發送到另一個錢包。但它不會發送值,除非我在 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 從一個使用者發送到另一個使用者。

希望能幫助到你。

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