Solidity

合約功能未按預期發送乙太坊

  • February 25, 2018

我正在使用 MetaMask 並對Ethereum Pet Shop教程進行一些更改。我正在使用Ganache CLI處理兩個不同的 MetaMask 帳戶,當adopt()被呼叫時,我希望將一些 eth 發送回以前的“所有者”或我的其他帳戶,但是,似乎沒有 eth 正在完全從契約中發送。

這是程式碼:

pragma solidity ^0.4.19;
contract Adoption {
 struct Pet {
   address owner;
   uint256 price;

 }

 Pet[16] data;

 function Adoption() public {
   for (uint i = 0; i < 16; i++) {

     data[i].price = 500;
     data[i].owner = msg.sender;
   }
 }


 // Adopting a pet
 function adopt(uint petId) public payable returns (uint, uint) {
   require(petId >= 0 && petId <= 15);
   if ( data[petId].price == 0 ) {
     data[petId].price = 100;
   } else {
     data[petId].price = data[petId].price * 2;
   }

   require(msg.value >= data[petId].price * uint256(1));
   returnEth(data[petId].owner,  (data[petId].price / 2)); 
   data[petId].owner = msg.sender;
   return (petId, data[petId].price);
   //return value;
 }





 function getAdopters() external view returns (address[], uint256[]) {
   address[] memory owners = new address[](16);
   uint256[] memory prices =  new uint256[](16);
   for (uint i=0; i<16; i++) {
     owners[i] = (data[i].owner);
     prices[i] = (data[i].price);
   }
   return (owners,prices);
 }

}

誰能指出我正確的方向?謝謝。

為了澄清,我想將合約的乙太坊發送給寵物的前“主人”。

當您500 / 1000在這一行中除以oldOwner.transfer((price / 1000));0 時。請注意,transfer()接受 wei 中的值而不是 Ether 中的值。如果您打算發送 0.5 wei,那麼這是不可能的。

這是有關 Solidity 中整數除法的更多詳細資訊Can’t do any integer division

我遇到了這個確切的問題,如果您想在 Remix 中測試程序時發送正確數量的 ETH,您只需在value執行選項卡下的欄位中輸入您想要與交易一起發送的值(以 wei 為單位)。如果你想通過前端發送 ETH,它會有點棘手,你需要使用 中的sendTransaction函式Web3.js,這裡有一個範例函式,你可以呼叫一個事件(可能是一個按鈕點擊)

  function callThisFunction() {
       web3.eth.getAccounts(function(error, result) {
       web3.eth.sendTransaction(
           {from:web3.eth.accounts[0],
           to: contractAdress,
           value:  "amount in wei you're requesting", 
           data: "hash of the function you want to call"
               }, function(err, result) {
         if (!err)
           console.log(result + " success"); 

       });
   });

   }

如果您只是呼叫此函式並填寫欄位,它將自動填寫合約希望使用者發送以使程序正常工作的正確數量的乙太幣(在您的情況下為 MetaMask)。

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