La transacción se revierte cuando llega a Requerir declaración en la función de pago

En resumen, cuando el usuario hace clic en un botón de envío desde la interfaz de usuario, debe pasar un precio fijo _pricepara que pay()funcione (hay opciones para elegir un precio fijo en la interfaz de usuario, por ejemplo: 0.01, 0.02, 0.03). En la función, verifica si msg.valuees igual a la cantidad pasada desde la interfaz de usuario. Luego, el remitente envía ese precio a la dirección del contrato y se suma al saldo total del contrato. Cuando lo depuro con remix, da un mensaje de error cuando golpearequire(_price == msg.value)

transacción a Test.pay con error: error de VM: revertir. revert La transacción ha sido revertida al estado inicial. Nota: El constructor debe pagar si envía valor. Depure la transacción para obtener más información.

contract Test {

    function Test() {
        owner = msg.sender;
    }

    function pay(uint _price) payable returns (bool) {
        //...

        require(_price == msg.value); // Check ether sent is matching with the price
        address(this).transfer(msg.value); // Send price to the contract address
        balanceOfContract[address(this)] += msg.value; // Store price to current contract balance

        LogDeposit(msg.sender, msg.value);

        return true;
    }
}

Aumenté el límite de gas por si acaso, pero todavía me da el error. ¡Se agradece la ayuda!

Supongo que asumiría eso _pricey msg.valueson diferentes. :-) ¿Está escribiendo exactamente el mismo número en el campo "valor" en la parte superior de Remix y en el campo junto al botón "pagar"?
Ah, ¿o es posible que la reversión esté en la siguiente línea? address(this).transfer(msg.value)no tiene mucho sentido Eso no tiene ningún efecto, ya que transfiere ether de contrato a contrato, por lo que no hay necesidad de esa línea. Además, fallará si no tiene una función de respaldo pagable.
Gracias por su respuesta. Puse exactamente el mismo número en el campo de valor (éter seleccionado) y el campo al lado del botón de pago y presioné el botón de pago en rojo. Todavía me quedé atascado en esa requirelínea. Yo borréaddress(this).transfer(msg.value)
El código básico me funciona bien en Remix. Agregué address owner;y eliminé todo payexcepto el requirey la returnlínea. Luego implementé el contrato usando la VM de JavaScript, ingresé 5tanto en el campo "valor" (con la unidad establecida en "wei") como en el campo junto al botón rojo "pagar". Luego presioné el botón "pagar" y no hubo ningún error.
¡Tienes razón! Cambié ether a wei y funcionó. ¿Por qué el éter no funciona?
1 éter = 1000000000000000000 wei. Entonces, si envía 1 éter, debe pasar 10000000000000000000 como parámetro a pay. ( msg.valuesiempre está en wei.)

Respuestas (1)

Resumiendo los hallazgos en el hilo de comentarios:

El problema era que el _pricepaso a la payfunción se especificaba en ether en lugar de en wei. msg.valuesiempre está en wei, por lo que requireestaba fallando.