Я использую MetaMask и вношу некоторые изменения в учебник Ethereum Pet Shop . Я работаю с двумя разными учетными записями MetaMask, используя интерфейс командной строки Ganache , и когда 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, а не в эфире. Если вы хотите отправить 0,5 вэй, то это невозможно.
Вот более подробная информация о целочисленном делении в Solidity Невозможно выполнить целочисленное деление
У меня была именно эта проблема, если вы хотите отправить правильное количество ETH при тестировании программы в Remix, вы можете просто ввести значение (в wei), которое вы хотите отправить с транзакцией, в поле под вкладкой запуска value
. Если вы хотите отправить 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), которое контракт хочет, чтобы пользователь отправил для правильной работы программы.
}
в конце вашего контракта, если вы поместите свой контракт в Remix, он скажет вам об этом.
Расти Шеклфорд
oldOwner.transfer(price);
без какого-либо разделения после установки , и между кошельками MetaMaskdata[i].price = 100000000;
по-прежнему нет движения .Расти Шеклфорд
Медведев1088