orden de tiempo al llamar funciones de contrato inteligente

¿Cómo puedo verificar que el minero realmente ejecute el orden correcto de llamadas de función de contratos inteligentes, si hay una necesidad de pedidos?

Declararlos todos privatey proporcionar una única publicfunción que los ejecute en el orden deseado. Alternativamente, puede agregar una variable de estado a su contrato ( enumsería ideal para este propósito) y usarla para implementar una máquina de estado. En cada función, requireesta variable se establece en un valor designado al comienzo de la función y se cambia al siguiente valor al final de la función.

Respuestas (1)

No puede asegurarse de que los mineros acepten transacciones en el orden previsto, pero puede verificar y rechazar si no lo hacen. Haría que cada nueva transacción dependiera de algo que vino antes.

Aquí, solo uso un contador simple.

pragma solidity 0.5.1;

contract Ordered {

    uint public nonce;

    event LogNextTransaction(address sender, uint transactionNumber);

    function doSomethingOrdered(uint transactionNumber) public {
        require(transactionNumber == nonce);
        emit LogNextTransaction(msg.sender, transactionNumber);
        nonce++;
    }
}

Este método es un poco impreciso en el sentido de que cualquier participante puede simplemente adivinar el siguiente nonce sin saber lo que vino antes (porque solo está contando). Puede hacer que los remitentes demuestren que tienen conocimiento de la transacción anterior al hacer que el requisito sea algo que no puedan adivinar (fácilmente). Existe una oportunidad no obvia de crear una condición de carrera si los remitentes son competitivos. Pídeme detalles si crees que podría ser relevante.

pragma solidity 0.5.1;

contract Ordered {

    bytes32 public lastHash;

    event LogNextTransaction(address sender, bytes32 txnHash);

    function doSomethingOrdered(bytes32 thisHash) public {
        bytes32 testHash = hashHelper(lastHash, msg.sender);
        require(testHash == thisHash);
        emit LogNextTransaction(msg.sender, testHash);
        lastHash = testHash;
    }

    // convenience function helps clients compute needed hashes
    function hashHelper(bytes32 hash, address sender) public pure returns(bytes32) {
        return keccak256(abi.encodePacked(hash, sender));
    }
}

Espero eso ayude.