Я пишу самодельную небольшую частную «цепочку блоков» в иллюстративных целях, которая будет использоваться в качестве учебного пособия. Я проработал все основные функции, но я думал о некоторых более специфических аспектах цепочки блоков и обнаружил, что задаюсь вопросом о длинных позициях в 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);