Soy un recién llegado a Ethereum y estoy escribiendo un contrato inteligente para mi proyecto. Usé Win 10 y Mist 0.8.8 con la red de prueba que comenzaba con "R".
El código del contrato tiene las funciones de cambiar el estado y algunos modificadores, sin embargo, después de iniciar el contrato, no puedo ejecutar ninguna función del mismo. Aparecen los siguientes errores. ¡¡¡Muchas gracias!!!
El código del contrato se muestra a continuación: ¡Muchas gracias!
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;
}
}
La Testnet tiene el nombre de Ropsten .
A partir de los datos sin procesar 0x295b4e17
en su primera imagen, está intentando ejecutar la paid()
función.
Revisé cada una de las firmas de función en la geth
línea de comando y la siguiente firma coincidió:
> web3.sha3("paid()").substring(0, 10)
"0x295b4e17"
Esta paid()
función tiene el modificador inState(State.Received)
y este modificador arrojará un error si la state
variable actual NO es State.Received
.
La advertencia que se muestra se debe a que Mist simula la llamada que intenta ejecutar y ha determinado que la llamada paid()
fallará porque la state
variable actual no está configurada en State.Received
.
Para probar su funcionalidad, puede:
Agregue otra(s) función(es) para mover su estado de flujo de trabajo a State.Received
; o
Elimina el inState(State.Received)
modificador de la paid()
función.
Sugeriría primero probar 2. arriba para que pueda determinar si puede ejecutar la paid()
función con éxito. Una vez que haya confirmado que la paid()
función sin el modificador se ejecuta con éxito, cree las otras funciones requeridas para mover su contrato cuando funcione state
con su modificador.State.Received
paid()
P : ¿Debería usar uint como el tipo de variable para registrar cada envío?
A : uint
(que es uint256
) es adecuado para registrar el número de éteres.
P : Cuando envío 1 Ether al contrato, muestra 1000000000 wai en su lugar.
R : 1 ether es 1e18 o 1,000,000,000,000,000,000 weis. en geth
:
> 1e18
1000000000000000000
> web3.fromWei(1e18,"ether")
"1"
> web3.toWei(1,"ether")
"1000000000000000000"
P : Finalmente, me gustaría aprender el cml para ejecutar el contrato. ¿Tienes algún enlace recomendado para mí?
R : Si cml
se refiere a la línea de comandos, es decir, usando la geth
línea de comandos, hay algunas guías paso a paso en:
También puede consultar la solidez del navegador: consulte ¿Cómo llamar a la función de biblioteca desde un contrato? => [error] El código de contrato no se pudo almacenar, verifique la cantidad de gas. indefinido para un ejemplo.
loco feliz
privacidadisahumanright.eth
loco feliz
uint
para ser el tipo de variable para registrar ehter enviar? Cuando envío 1 Ether al contrato, muestra 1000000000 wai en su lugar. Finalmente, me gustaría aprender el cml para ejecutar el contrato. ¿Tienes algún enlace recomendado para mí? Muchas gracias.privacidadisahumanright.eth