Start- und Endblockfunktion Zurückgekehrte Transaktionen

Ich versuche, eine Funktion zu erstellen, die es Benutzern ermöglicht, Token nur zwischen bestimmten Blocknummern zu kaufen und alle anderen Transaktionen rückgängig zu machen, die versuchen, nach oder vor diesen Blocknummern zu kaufen, im Grunde ein Timer, der den Kauf öffnet und schließt. Ich bin auf das Problem gestoßen, dass die Funktionen funktionieren nicht, anstatt mich zwischen den Blöcken kaufen zu lassen, lässt mich der Vertrag nicht jederzeit kaufen, wenn die Transaktion immer fehlschlägt, (wird zurückgesetzt), der Ether wird nie übertragen und verlässt nicht einmal meine Brieftasche. Testen auf dem Ropsten Testnet.

Testen Sie dies an einer Kette, bei der diese Blocknummern gültig sind? Denn bei testRPC beispielsweise wird das natürlich nicht so sein.
Ich teste dies im Ropsten-Testnet und stelle immer sicher, dass die Blöcke relevant sind, ich ändere sie ständig und schaue mir die aktuellen Blöcke über ropsten.etherscan.io/blocks an

Antworten (2)

Der Zeitstempel in Ethereum ist ein Sekunden-Zeitstempel, eine Anzahl von Sekunden, die seit der Epoche (01.01.1970) vergangen sind. Der von Ihnen angegebene Zeitstempel, d. h.

uint public startBlock = 1516220;
uint public endBlock = 1516240;

gibt startBlock den Wert 18 Jan 1970 13:10:20 +0000 and endBlock as18 Jan 1970 13:10:40 +0000`. (Zum Zeitpunkt des Schreibens der ans ist der Zeitstempel 1503356016 in Sekunden). Es geht also um die Wertschöpfung.

Sie können den startBlock-Wert angeben, now ()der den Zeitstempel des aktuellen Blocks zurückgibt.

Auch in dieser Linie

uint tokens = safeDiv(safeMul(msg.value * 1.01 ether, getPrice()), 1000000000000000000 ether);

Msg.value gibt den Wert nur in Ether an, dh value entered*10^18. Das Schreiben von msg.value* 1.01 Ether ist also nicht erforderlich (auch warum 1.01 Ether).

startBlock=block.timestamp 

Dies gibt den aktuellen Zeitstempel für den Startblock an. Für Endblock tun

endBlock= startBlock + noOfSec

wo noOfSecist die Gesamtzahl der Sekunden, die der Crowdsale nach dem Start läuft

1,01 Ether, weil ich möchte, dass die Leute 1 Prozent zusätzliche Token für jeden Ether bekommen, und auch, wie finde ich den Zeitstempel? wo kann ich es finden, woher weiß ich, wo ich den richtigen Wert finde.

So etwas sollte funktionieren:

contract Crowdsale {
    uint public startBlock;
    uint public endBlock;

    uint public constant PRICE = 400;

    Crowdsale(uint _startBlock, uint _endBlock) {
        require(block.number < _startBlock);
        require(_startBlock < _endBlock);
    }

    function buy() payable {
        require(block.number >= startBlock && block.number <= endBlock);
        require(msg.value > 0);
        // Calculate tokens
        int tokens = msg.value * PRICE;
        balance[msg.sender] += tokens;
    }
}