-Я пытаюсь перевести эфир с одной учетной записи на другую, используя смарт-контракт, развернутый на 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;
}
}`
Звучит как недоразумение.
Невозможно написать контракт, который будет доходить и тратить средства отправителя. Вы получаете хэш транзакции до того, как сеть его обработает, и, вполне возможно, что-то пойдет не так.
Рассмотрим три стороны:
Отправитель может отправить средства на контракт. Контракт может направлять полученные средства (или расходовать собственные) бенефициару.
Было бы довольно часто писать функцию, которая получает средства от отправителя и отправляет их получателю. В этом случае функция должна быть помечена ключевым словом 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
из функции. Я думаю, что идея заключается в том, что это неявное количество отправленного эфира.
Также стоит отметить. Важно дождаться завершения транзакции, чтобы увидеть окончательный результат.
Надеюсь, поможет.
Эдмунд Эдгар
СвапнилКумбхар