Я новичок в Ethereum и пишу часть смарт-контракта для своего проекта. Я использовал Win 10 и Mist 0.8.8 с тестовой сетью, которая начиналась с «R».
В коде контракта есть функции изменения состояния и какой-то модификатор, однако после того, как я запустил контракт, я не могу запустить ни одну из его функций. Появляются следующие ошибки. Большое спасибо!!!
Код контракта показан ниже: Большое спасибо!
pragma solidity ^0.4.6;
contract FairTrade {
/* Variables */
address public creater;
address public trader;
address public framer;
address public preieumHandler;
/* State handling */
enum State { Paying, Transporting, Received, Completed }
State public state;
/* Contructor */
function FairTrade(address _trader, address _framer, address _preieumHandler,
uint _price, uint _quantity) {
creater = msg.sender;
trader = _trader;
framer = _framer;
preieumHandler = _preieumHandler;
}
/* Modifiers */
modifier onlyFramer {
if (msg.sender != framer) throw ; else _;
}
modifier onlyTrader {
if (msg.sender != trader) throw; else _;
}
modifier inState(State s) {
if (state != s) throw; else _;
}
modifier notInState(State s) {
if (state == s) throw; else _;
}
/* Functions */
function completedPaid() onlyTrader {
state = State.Transporting;
}
function receivedGood() inState(State.Transporting) onlyFramer {
state = State.Received;
}
function paid() inState(State.Received) {
state = State.Completed;
}
}
Тестовая сеть называется Ropsten .
Из необработанных данных 0x295b4e17
на вашем первом изображении вы пытаетесь выполнить paid()
функцию.
Я проверил каждую из сигнатур функций в geth
командной строке, и следующая сигнатура совпала:
> web3.sha3("paid()").substring(0, 10)
"0x295b4e17"
Эта paid()
функция имеет модификатор, inState(State.Received)
и этот модификатор выдаст ошибку, если текущая state
переменная НЕ State.Received
.
Предупреждение, которое вы видите, связано с тем, что Mist имитирует вызов, который вы пытаетесь выполнить, и определил, что вызов paid()
завершится ошибкой, поскольку текущая state
переменная не установлена на State.Received
.
Чтобы проверить свою функциональность, вы можете:
Добавьте другие функции, чтобы перевести рабочий процесс в состояние State.Received
; или же
Удалите inState(State.Received)
модификатор из paid()
функции.
Я бы посоветовал сначала попробовать 2. выше, чтобы вы могли определить, можете ли вы paid()
успешно выполнить функцию. После того, как вы подтвердите, что paid()
функция без модификатора выполняется успешно, создайте другие требуемые функции, чтобы переместить ваш контракт state
в то время, State.Received
когда paid()
с вашим модификатором будет работать.
В : Должен ли я использовать uint в качестве типа переменной для записи отправки?
A : uint
(то есть uint256
) подходит для записи количества эфиров.
В : Когда я отправляю 1 Эфир на контракт, вместо этого отображается 1000000000 вай.
О : 1 эфир равен 1e18 или 1 000 000 000 000 000 000 вейсов. В geth
:
> 1e18
1000000000000000000
> web3.fromWei(1e18,"ether")
"1"
> web3.toWei(1,"ether")
"1000000000000000000"
В : Наконец, я хотел бы выучить cml для запуска контракта. У вас есть рекомендуемая ссылка для меня?
О: Если cml
речь идет о командной строке, т. е. об использовании geth
командной строки, есть несколько пошаговых руководств по адресу:
Вы также можете проверить Browser Solidity — см. Как вызвать библиотечную функцию из контракта? => [ошибка] Не удалось сохранить код контракта, проверьте количество газа. undefined для примера.
счастливый сумасшедший
конфиденциальностьisahumanright.eth
счастливый сумасшедший
uint
тип переменной для записи или отправки? Когда я отправляю 1 эфир на контракт, вместо этого показывает 1000000000 вай. Наконец, я хотел бы изучить cml для запуска контракта. У вас есть рекомендуемая ссылка для меня? Большое спасибо.конфиденциальностьisahumanright.eth