Конструктор должен быть платным, если вы отправляете значение

Я написал контракт следующим образом:

 pragma solidity ^ 0.4 . 0 ; 

 /* Simple contract that mediates disputes using a trusted arbiter */ contract Taxi   { 

     enum   State   { IDLE ,  FINDING_DRIVER ,  AWAITING_PAYMENT ,  AWAITING_DESTINATION ,  COMPLETE } 
     State   public  currentState ; mapping ( address =>   uint )   public  balances ; bytes32 STRING_COMPLETE =   "Complete" ; bytes32 STRING_PARTIAL =   "Partial" ; modifier customerOnly ()   {   require ( msg . sender ==  customer );  _ ;   } modifier driverOnly ()   {   require ( msg . sender ==  driver );  _ ;   } modifier arbiterOnly ()   {   require ( msg . sender ==  arbiter );  _ ;   } modifier inState ( State  expectedState )   {   require ( currentState ==  expectedState );  _ ;   } address public  customer ; address public  driver ; address public  arbiter ; 

     function   Taxi ( address _customer ,  address _driver ,  address _arbiter )   public   { customer =  _customer ; driver =  _driver ; arbiter =  _arbiter ; 
     } 

     function  assignDriver ()  customerOnly inState ( State . IDLE )   public   { 
         //arbiter.transfer(this.balance); currentState =   State . FINDING_DRIVER ; 
     } 

     function  confirmAmount ( uint  amount )  driverOnly inState ( State . FINDING_DRIVER )   public  returns ( bool   )   { 
         if ( amount <   0 )   { amount =   20 ; 
         } 
         //driver has set this amount and user has accepted this fare, return true if customer has sufficient balance 
         if ( balances [ customer ]   <  amount )   { 
             return   false ; 
         } currentState =   State . AWAITING_DESTINATION ; balances [ arbiter ]   +=  amount ; balances [ customer ]   -=  amount ; 
         return   true ; 
     } 
 } 

Сначала я выполняю функцию assignDriver, которая работает правильно. Позже, когда я выполняю функцию verifyAmount, я получаю сообщение об ошибке:

 transact to Taxi . confirmAmount errored :  VM error :  revert . revert The  transaction has been reverted to the initial state . 
 Note :   The   constructor  should be payable if  you send value .    Debug  the transaction to get  more information . 

Я попытался добавить ключевое слово payable в конструктор, но все равно получил ту же ошибку. В чем может быть проблема?

Я предполагаю, что один из ваших модификаторов отменяет транзакцию. Попробуйте удалить модификаторы для подтверждения, а затем добавьте их по одному за раз, чтобы увидеть, какой из них.
Я предполагаю, что это неверно. modifier customerOnly() { require(msg.sender == customer); _; }
Может быть, вы должны описать, что вы хотите сделать, чтобы иметь возможность помочь
@RobHitchens это правильно. Подтверждение счета может вызываться только водителем. modifier driverOnly() { require(msg.sender == driver); _; } modifier driverOnly() { require(msg.sender == driver); _; } был ложным в моем случае.

Ответы (1)

Неясно, что делает comfirmAmount:

 function  confirmAmount ( uint  amount )  driverOnly inState ( State . FINDING_DRIVER )   public  returns ( bool   )   { 
         if ( amount <   0 )   { amount =   20 ; 
         } 

Это никогда не будет введено, если числа ниже нуля невозможны.

 //driver has set this amount and user has accepted this fare, return true if customer has sufficient balance 
 if ( balances [ customer ]   <  amount )   { 
     return   false ; 
 } currentState =   State . AWAITING_DESTINATION ; balances [ arbiter ]   +=  amount ; balances [ customer ]   -=  amount ; 
     return   true ; 
 } 

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

Но ни один из вышеперечисленных вопросов не вернется. Единственная возможность состоит в том, что транзакция для выполнения verifyAmount не выполняется "драйвером" учетной записи, и модификатор выбрасывает.

Да, сумма не будет отрицательной из-за целого числа без знака. verifyAmount должен был быть вызван «драйвером», который я не вызывал как драйвер. Спасибо что подметил это.