Можете ли вы увеличить длинный литерал с помощью оператора ++ и получить доступ ко всему длинному литеральному диапазону в Java? - PullRequest
0 голосов
/ 07 апреля 2019

Я пишу самодельную небольшую частную «цепочку блоков» в иллюстративных целях, которая будет использоваться в качестве учебного пособия. Я проработал все основные функции, но я думал о некоторых более специфических аспектах цепочки блоков и обнаружил, что задаюсь вопросом о длинных позициях в Java. Метод 'miner', который я встроил в приложение, увеличивает значение nonce типа long с помощью оператора ++ до тех пор, пока не будет выполнено условие. Мой вопрос: если бы я хотел избежать (или, по крайней мере, значительно продлить) шанса исчерпания целочисленного пространства одноразовых номеров (2147483647), если я инициализировал начальное значение одноразового номера, я передал бы методу майнера с Nonce = 0L; Могу ли я увеличить его с помощью оператора ++ и использовать полный длинный буквенный диапазон?

Насколько я понимаю, Биткойн использует специальное входное значение в транзакции, и / или некоторые майнеры немного изменят отметку времени для "ExtraNonce", но так как это только для иллюстрации, я не хочу заходить так далеко, как в том числе что-то похожее в приложение.

Я могу предоставить фрагменты кода, если кто-то захочет их увидеть по любой причине, любые мысли будут с благодарностью!

Код ниже:

(пожалуйста, не обращайте внимания на мою сомнительную логику управления if / else, это не законное производственное приложение, и я все еще новичок в Java)

Это код из класса запуска, который вызывает метод майнера:

 } else if (cliInput.contentEquals("mine")) {
                Scanner howMany = new Scanner(System.in);
                System.out.println("\n");
                System.out.println("Enter number of blocks to mine: \n");
                int howManyBlocks = howMany.nextInt();
                int numBlocksMined = 0;
                while (howManyBlocks >= numBlocksMined) {
                    MainChain mc = new MainChain();
                    long indexValue = (HashArray.hashArray.size() / 8);
                    long timeStamp = mc.getUnixTimestamp();
                    String data = helpers.SHA256.generateHash(pubKey + addressKey);
                    String previousHash = mc.getPreviousBlockHash();
                    ChainBuilder cb = new ChainBuilder();
                    cb.miner(indexValue, timeStamp, data, 0, previousHash, 5);
                    numBlocksMined++;
                }

Вот ядро ​​метода майнера:

public void miner(long index, long currentTimeMillis, String data, long Nonce, String previousBlockHash, int difficulty) throws InterruptedException {
        this.index = index;
        this.currentTimeMillis = currentTimeMillis;
        this.pszTimeStamp = pszTimeStamp;
        this.Nonce = Nonce;
        this.previousBlockHash = previousBlockHash;
        this.difficulty = difficulty;
        this.data = data;
        boolean iterator = true;

        String blockHeader = (index + currentTimeMillis + data + Nonce + previousBlockHash + difficulty);
        String hash = SHA256.generateHash(blockHeader);

        startTime = System.nanoTime();
        TimeUnit.SECONDS.sleep(1);
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("\n");
                System.out.println("Current hash rate: " + hashRate + " " + "hash/s");
            }
        }, 0, 3000);

        while (iterator) {
            blockHeader = (index + currentTimeMillis + data + Nonce + previousBlockHash + difficulty);
            hash = SHA256.generateHash(blockHeader);
            if (difficulty == 1) {

                if (!hash.startsWith("0")) {
                    Nonce++;
                    endTime = System.nanoTime();
                    deltaN = endTime - startTime;
                    deltaS = (deltaN / 1000000000);
                    hashRate = (Nonce / deltaS);

                } else {
                    System.out.println("Hash found!");
                    System.out.println("[" + hash + "]");
...............

Что мне интересно, если я передам 0L вместо 0 методу майнера, получу ли я доступ ко всему диапазону?

Так что вместо:

cb.miner(indexValue, timeStamp, data, 0, previousHash, 5);

Могу ли я передать его таким образом, чтобы использовать весь длинный буквальный диапазон?

cb.miner(indexValue, timeStamp, data, 0L, previousHash, 5);

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Оператор ++ работает как положено для long переменных.

1 голос
/ 07 апреля 2019

Да, для long ++ будет использоваться набор команд ladd (iadd для int).

См. 6.5 Инструкция # s # ladd


Так как ваш вопрос полностью изменился с вашим редактированием, и я все еще видел его ..

cb.miner(indexValue, timeStamp, data, 0, previousHash, 5);

Если вы передадите 0 таким образом, он будет обрабатываться как int, поэтому вы можете поместить туда только MAX_INTEGER, хотя параметр метода принимает long (он будет рассматриваться как таковой в теле метода). ).

...