Преобразование wei в эфир в контракте

Я делаю первые шаги в разработке Ethereum.

То, что я пытаюсь сделать, это написать функцию, которая принимает адрес и отправить его 1 ETH. Я не понимаю, как проверить, есть ли у контракта достаточные средства, tx.origin.balance находится в формате wei, как я могу преобразовать wei в eth.

function refillAccount(address receiver) payable returns(bool isRefilled) {
    if (tx.origin.balance < [1 eth]) {
        refilledAccounts[receiver] = false;
        return false;
    }

    if ( !refilledAccounts[receiver] ) {
        refilledAccounts[receiver] = true;
        if( !receiver.send(1 ether) ) 
        throw;
        return true;
    }
}
4 голоса | спросил underdog 5 Jam1000000amThu, 05 Jan 2017 00:12:26 +030017 2017, 00:12:26

2 ответа


6

Полностью согласен с Ричардом. Контракты обычно работают лучше всего в Вэй, используя целые числа. Конвертация в /из Eth обычно должна выполняться на стороне клиента при общении с пользователями.

Значение, которое вы ищете, называется msg.value - сумма, полученная в договоре с транзакцией. В приведенном ниже коде проверяется, что это правильная сумма, и только форвардные средства, которые она фактически получила. В маловероятном случае, когда что-то ускорится с пересылкой средств, средства будут возвращены отправителю.

tx.origin является опасным. msg.sender почти всегда предпочтительнее.

Это не тщательно протестировано, но, надеюсь, вам поможет получить то, куда вы направляетесь:

pragma solidity ^0.4.6;

contract Practice {

    function refillAccount(address receiver) payable returns(bool isRefilled) {

        if(msg.value != 1 ether) throw; // accept exactly 1 ether and nothing else
        // the sender has sent us 1 ether, so we can pass it on.
        if(!receiver.send(msg.value)) {
            throw; // if we can't pay it forward, send it back
        }
        // it happened
        return true;
    }
}
ответил Rob Hitchens 5 Jam1000000amThu, 05 Jan 2017 02:21:27 +030017 2017, 02:21:27
4

Базовый блок для валюты в Solidity - Wei. Это означает, что если вы имеете дело с балансами, и вы не указываете единицу, то по умолчанию используется значение Wei.

Тем не менее, вы можете укажите единицы явно : wei, finney, szabo и ether. Пока вы используете ether (не «eth ") в вашем контракте, сравнение будет работать нормально.

Для фактического преобразования между номиналами этот предыдущий ответ содержит исчерпывающий список. Существует также инструмент преобразования: https://etherconverter.online/

ответил Richard Horrocks 5 Jam1000000amThu, 05 Jan 2017 00:27:52 +030017 2017, 00:27:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132