Перевод эфира на другой счет

-Я пытаюсь перевести эфир с одной учетной записи на другую, используя смарт-контракт, развернутый на Azure.

-когда я вызываю receiverAddress.send(amount)функцию в своем контракте, она возвращает квитанцию/подтверждение транзакции в формате json.

-Мой счет списывается на указанную мной сумму, но счет получателя не зачисляется. квитанция показывает from :myAddressт.е. адрес отправителя иto:contract address

-Я не понимаю, почему в поле to указан контрактный адрес, когда я звонюreceiverAddress.send(amount)

-Я что-то упускаю или мне нужно перевести этот эфир с контакта на аккаунт получателя??

- Ниже приведен фрагмент квитанции о транзакции: -Квитанция о транзакции

-функция из контракта

function sendPayment(address beneficiary,uint amount){
     coin-=amount;
     if (beneficiary.send(amount))
     throw;
}

это код контракта:

`pragma solidity ^0.4.4;

import "./strings.sol";

contract SDFFinance {
    using strings for *;
    address addr;
    address public driver1;
    address public driver2;
    address public driver3;
    string statusOf;
    uint coin;

function SDFFinance(uint balance) {
    coin=balance;
    driver1=0x1b7207197717fe2114d3d22f38c81d980e74e13a;
    driver2=0x1b7207197717fe2114d3d22f38c81d980e74e13a;
    driver3=0x1b7207197717fe2114d3d22f38c81d980e74e13a;
    statusOf='OPN';
  }  

function changeShipmentStatus(string shipmentId,string st){
            statusOf=st;
        processPayment();
}

function processPayment(){
    if(statusOf.toSlice().equals('RAP'.toSlice())){
        sendPayment(driver1);
    }
    else if(statusOf.toSlice().equals('DAL'.toSlice())){
        sendPayment(driver2);
    }

    else
    if(statusOf.toSlice().equals('ATD'.toSlice())){
        sendPayment(driver3);
    }
}



function sendPayment(address beneficiary) payable returns(bool success) {
  if(msg.value==0) throw;
  if(!beneficiary.send(msg.value)) throw;
  return true;
}

function getBalance() returns(uint){
    return coin; 
}

function getStatus() returns(string){
    return statusOf; 
}

function getAddress() returns(address){
    return addr; 
}

}`
Не уверен, что именно здесь происходит, поскольку мы можем видеть только фрагменты вашего кода, но одна вещь, которая бросается в глаза: в sendPayment вы выдаете ошибку, если платеж получателю прошел успешно. Вы хотели выдать ошибку, если она не работает?
да, вы правы, но фактическая проблема в том, что я получаю эфир от отправителя в своем контракте, но не могу отправить его получателю

Ответы (1)

Звучит как недоразумение.

Невозможно написать контракт, который будет доходить и тратить средства отправителя. Вы получаете хэш транзакции до того, как сеть его обработает, и, вполне возможно, что-то пойдет не так.

Рассмотрим три стороны:

  • Отправитель
  • Бенефициар
  • Договор

Отправитель может отправить средства на контракт. Контракт может направлять полученные средства (или расходовать собственные) бенефициару.

Было бы довольно часто писать функцию, которая получает средства от отправителя и отправляет их получателю. В этом случае функция должна быть помечена ключевым словом payable, в противном случае она будет сгенерирована и возвращена при подключении эфира.

Я не уверен, что coin -= amountделает.

Вот примерно так будет выглядеть пересылка полученного эфира.

function sendPayment(address beneficiary) payable returns(bool success) {
  if(msg.value==0) throw;
  if(!beneficiary.send(msg.value)) throw;
  return true;
}

Чтобы перевести средства с помощью этой функции, отправьте их с помощью (примерно)contractInstance.sendPayment(beneficiary, {from: sender, to: contract, value: amount}).then(function(txnHash) ...

Обратите внимание, что я удалил amountиз функции. Я думаю, что идея заключается в том, что это неявное количество отправленного эфира.

Также стоит отметить. Важно дождаться завершения транзакции, чтобы увидеть окончательный результат.

Надеюсь, поможет.

без проблем. Вы можете проголосовать или отметить решение, если ответ был полезен.
Все еще сталкиваясь с той же проблемой, эфир не переводится на другую учетную запись, можете ли вы показать какой-нибудь простой пример контракта, который показывает, как перевести эфир с одной учетной записи на другую?
То, что вы просите, невозможно. Неправильный подход. Невозможно написать контракт на передачу от Алисы к Бобу... Алиса -> Боб не работает. Функция выше позволяет Алисе отправлять средства на контракт. Контракт на пересылку собственных средств Бобу. Алиса -> Контракт -> Боб. Это работает.
Можете ли вы сказать мне, как добавить эфир в контракт, я пробовал: truffle(development)> web3.eth.sendTransaction({from:web3.eth.coinbase, to:contractAddress, value: web3.toWei(0.05, "ether" )) но это не работает
даже после запуска вышеуказанной функции, когда я проверяю баланс контракта, он показывает ноль
Это по дизайну. Возможно, мы все еще не знаем, чего вы хотите достичь. Выше функции Алиса отправляет по контракту 1 эфир. Сейчас в контракте 1 Эфир. Контракт пересылает 1 эфир Бобу. Сейчас в контракте 0 Эфира. У Алисы на единицу меньше, а у Боба на единицу больше, чем начальные условия.