Как одноразовый номер из доказательства работы обеспечивает действительные записи транзакций в блоке? - PullRequest
1 голос
/ 02 августа 2020

Я новичок в Blockchain, учусь применять его в javascript, одновременно разбираясь в вещах. У меня есть один вопрос, который я много пытался найти, но не получил четкого объяснения.

Вопрос : Предположим, у меня есть 3 записи транзакций и предыдущий блок ha sh. Я также узнал значение Nonce. В совокупности я получил желаемое ha sh из 4 '0 впереди. Теперь везде, где я читал, написано, что это доказывает действительность блокировки. Но как?! Я имею в виду, что, если, прежде чем нахожу ha sh, я (или кто-то) ПРОБЛЕМАЮ ЭТИ 3 СДЕЛКИ. Я снова смог найти ha sh с 4 '0, но на этот раз я изменил СУММУ в этих 3 транзакциях (сделав их ошибочными).

Как мы можем быть уверены, что эти транзакции составляют GIT LE. Считайте, что это новейший блок, меня беспокоит достоверность этих трех записей транзакций.

Если доказательство работы не гарантирует критически важную информацию (записи транзакций), то в чем его смысл. Что подтверждает, что записи транзакций в блоке не ошибочны? (Майнеры не вмешивались в них перед добавлением блока в блокчейн)

Доказательство работы & ha sh функции блока в JS:

// Hashing Single Block
Blockchain.prototype.hashBlock = function(previousBlockHash, currentBlockData, nonce){
  const dataAsString = previousBlockHash + 
                       nonce.toString() + 
                       JSON.stringify(currentBlockData);
  const hash = sha256(dataAsString);
  return hash;
};

// Proof of Work
Blockchain.prototype.proofOfWork = function(previousBlockHash, currentBlockData){
  let nonce = 0;
  let hash = this.hashBlock(previousBlockHash, currentBlockData, nonce);
  while(hash.substr(0, 4) !== '0000'){
    nonce++;
    hash = this.hashBlock(previousBlockHash, currentBlockData, nonce);
    // console.log(hash);
  }
  return nonce;
};

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Я попытаюсь дать упрощенный ответ, поскольку есть много деталей, которые не требуются для понимания решения.

Прежде всего, давайте посмотрим, из чего состоит транзакция:

  1. Данные транзакции:
  • адрес, с которого приходят деньги
  • адрес, на который отправляются деньги
  • сумма
подпись данных транзакции, созданных с помощью вашего закрытого ключа ваш publi c ключ

Когда вы создаете адрес для людей, на которые будут переводить деньги, где это адрес откуда? Прежде всего, вы создаете пару открытого / закрытого ключей. Пара открытый / закрытый ключ - это результат сложной математики . Интересно, что вы можете делать с этими ключами. Вы можете подписать сообщение своим приватным ключом. Если у вашего друга есть ваш publi c ключ, он может проверить, что подпись действительна для этого сообщения, что означает, что они могут проверить, что это вы написали это сообщение.

В блокчейне адресом является sha256 ha sh ключа publi c.

Теперь, когда пришло время переводить деньги, вам нужно сделать две вещи:

  1. Показать, что вы владелец этого адреса. Вы делаете это, предоставляя ключ publi c. В этом случае майнеры могут использовать sh ваш publi c ключ, чтобы убедиться, что он приводит к адресу «от».
  2. Подтвердить, что вы владеете закрытым ключом. Вы делаете это, создавая подпись данных транзакции.

Если майнер изменяет адрес 'to', адрес 'from' или сумму, подпись данных транзакции не действителен больше.

Если майнер решает добавить новую подпись на основе измененных данных, он больше не будет проверять с помощью ключа publi c в транзакции.

Если майнер решает изменить подпись и publi c так, чтобы они совпадали, тогда адрес отправителя больше не будет правильным, поскольку это ha sh ключа publi c.

Я упустил некоторые детали, например:

  • Адрес 'from' относится к предыдущей транзакции
  • Сумма предыдущей транзакции должна быть полностью потрачена. Так что, если там слишком много, у вас будет второй адрес «куда», который находится под вашим контролем, в основном передавая остальное обратно себе
  • Может быть много адресов «от» и «до». за одну транзакцию. Каждый адрес отправителя требует c ключа publi и подписи.
  • На самом деле транзакция содержит сценарий, который говорит, как проверять адреса и подписи. Если вы расширите язык, используемый в этом скрипте, то вы говорите о смарт-контракте.
  • Существуют закрытые ключи, которые могут генерировать несколько ключей publi c и, следовательно, несколько адресов, поэтому у вас нет для управления несколькими закрытыми ключами.
  • Невозможно проверить, действителен ли адрес «Кому». Таким образом, вы можете переводить деньги на адрес, для которого ни у кого нет закрытого ключа.

Подробную информацию о том, что входит в транзакцию, можно найти здесь: https://en.bitcoin.it/wiki/Transaction

1 голос
/ 02 августа 2020

Сама запись о транзакции имеет цифровую подпись стороны, которая изначально создала транзакцию. Только он / она имеет закрытый ключ для генерации транзакции. Когда вы изменяете одно значение в записи транзакции, цифровая подпись становится недействительной, и поэтому сама транзакция становится недействительной. Вы можете изменить данные записи транзакции, но тогда никакой другой узел не примет эту транзакцию (или добытый блок), поскольку он содержит недопустимые данные.

Эта проверка, действительна ли сама запись транзакции или нет, не связана доказательство работы, которую вы должны выполнить, чтобы добыть новый блок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...