Я пишу импровизированную маленькую частную «цепочку блоков» в иллюстративных целях, чтобы использовать ее в качестве учебного пособия. У меня есть все основные функциональные возможности, но я думал о некоторых наиболее специфических аспектах цепочки блоков и обнаружил, что задаюсь вопросом о longs в java. Метод «майнера», который я встроил в приложение, увеличивает одноразовое значение типа 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);
Если метод майнера принимает целое число, передача 0L
не имеет смысла. Пожалуйста, расширьте, что вы имеете в виду.
Я добавил фрагменты кода. Nonce имеет тип long, но насколько я понимаю, если вы явно не укажете компилятору, что это длинный литерал с суффиксом «L», он будет иметь тот же диапазон, что и целое число.
Столько текста и столько кода для такого тривиального вопроса. Ответ в том, что произошло, когда вы попробовали это. Не делайте из мухи слона.
Я новичок в java, и, честно говоря, я изначально не публиковал код с ним, кто-то запросил его, я просто хотел убедиться, что в том, что я говорил, есть контекст, поскольку кто-то сразу же попросил код ... поэтому я не на самом деле не думаю, что это заслуживает того, чтобы за него проголосовали, тем более что вопрос действительно показал некоторые исследовательские усилия. Но, увы, это сработало, и я получил ответ, который принял.
Да, для long++ будет использоваться набор инструкций ladd
(iadd
для int).
Поскольку ваш вопрос полностью изменился с вашим редактированием, и я все еще видел его.
cb.miner(indexValue, timeStamp, data, 0, previousHash, 5);
Если вы передадите 0
таким образом, он будет рассматриваться как int
, поэтому вы можете поместить туда только MAX_INTEGER
, хотя параметр метода принимает long
(он будет рассматриваться как таковой в теле метода).
Ура, ты опередил меня с ответом на минуту.
Ха-ха, мой вопрос не полностью изменился, я просто не знал, передается ли одноразовый номер с суффиксом «L» (что делает его длинным литералом), если вы все еще можете увеличить его с помощью оператора ++. Отсюда и заголовок: «Можете ли вы увеличить длинный литерал с помощью оператора ++». Спасибо всем за супер оперативные ответы! Я обновил заголовок для ясности. (:
Оператор ++
работает, как и ожидалось, с long
переменными.
не могли бы вы поделиться кодом?