Рубрики
Без рубрики

Давайте сделаем крошечный блокчан больше

Часть 2 с большим количеством линий Python. Теги с биткойн, блокчан, Python.

Примечание: эта статья предполагает, что вы прочитали Часть одна Отказ Крошечный блокчан был чрезвычайно простым, и было относительно легко сделать. Но, с его простотой пришла несколько недостатков. Во-первых, SnakeCoin только побежал на одной машине, поэтому она была далеко от распределения, не говоря уже о децентрализации. Во-вторых, блоки могут быть добавлены в цепочку так быстро, как хост-компьютер может создать объект Python и добавить его в список. В случае простого блокчана, это не проблема, но теперь мы будем позволить SnakeCoin – фактическим криптовалем, поэтому нам понадобится контроль количества блоков (и монет), которые могут быть созданы одновременно.

Отныне данные Snakecoin будут транзакциями, поэтому поля данных каждого блока будет список некоторых транзакций. Мы определим транзакцию следующим образом. Каждая транзакция станет объектом JSON, детализируя отправителя монеты, получателя монеты, и количество переноса SnakeCoin, которое передается. Примечание: транзакции находятся в формате JSON по причине, по которой я подробно подробно.

{
  "from": "71238uqirbfh894-random-public-key-a-alkjdflakjfewn204ij",
  "to": "93j4ivnqiopvh43-random-public-key-b-qjrgvnoeirbnferinfo",
  "amount": 3
}

Теперь, когда мы знаем, как будут выглядеть наши транзакции, нам нужен способ добавить их в один из компьютеров в нашей сети Blockchain, называемый узлом. Для этого мы создадим простой HTTP-сервер, чтобы любой пользователь мог позволить нашим узлам знать, что появилась новая транзакция. Узел сможет принять запрос на почту с транзакцией (например, выше) как тело запроса. Вот почему транзакции являются JSON отформатированы; Нам нужно, чтобы они были переданы на наш сервер в тело запроса.

pip install flask # Install our web server framework first
from flask import Flask
from flask import request
node = Flask(__name__)

# Store the transactions that
# this node has in a list
this_nodes_transactions = []

@node.route('/txion', methods=['POST'])
def transaction():
  if request.method == 'POST':
    # On each new POST request,
    # we extract the transaction data
    new_txion = request.get_json()
    # Then we add the transaction to our list
    this_nodes_transactions.append(new_txion)
    # Because the transaction was successfully
    # submitted, we log it to our console
    print "New transaction"
    print "FROM: {}".format(new_txion['from'])
    print "TO: {}".format(new_txion['to'])
    print "AMOUNT: {}\n".format(new_txion['amount'])
    # Then we let the client know it worked out
    return "Transaction submission successful\n"

node.run()

Потрясающий! Теперь у нас есть способ сохранить запись пользователей, когда они отправляют SnakeCoins друг на друга. Вот почему люди ссылаются на блокировку как общедоступные, распределенные книги: все транзакции хранятся для всех, чтобы увидеть и сохранены на каждом узле в сети.

Но возникает вопрос: Откуда люди получают сонакеэкоины? Нигде, пока. Там нет такой вещи, как SnakeCoin еще, потому что ни одна монета еще не создана и выдана. Чтобы создать новые монеты, люди должны Мой Новые блоки SnakeCoin. Когда они успешно мои новые блоки, новый SnakeCoin создается и вознагражден человеку, который добывал блок. Монета затем распространяется, как только шахтер отправляет SnakeCoin другому человеку.

Мы не хотим, чтобы это было слишком легко моим новыми новыми блоками SnakeCoin, потому что это создаст слишком много SnakeCoins, и у них будет мало ценности. И наоборот, мы не хотим, чтобы было слишком сложно, чтобы мои новые блоки, потому что не хватало монеты для всех, чтобы потратить, и они были бы слишком дорогими для нашего симпатия. Чтобы контролировать трудность добычи новых SnakeCoins, мы реализуем Доказательство работы (POW) алгоритм. Алгоритм доказательства работы, по сути, является алгоритмом, который генерирует элемент, который трудно создать, но легко проверить. Товар называется доказательством и, как оно звучит, доказательство того, что компьютер выполнил определенное количество работы.

В SnakeCoin мы создадим несколько простых доказательств алгоритма работы. Чтобы создать новый блок, компьютер шахтера должен будет увеличивать номер. Когда этот номер делится на 9 (количество букв в «SnakeCoin») и доказательство номера последнего блока, будет добываться новый блок SnakeCoin, и шахтер будет предоставлен совершенно новый SnakeCoin.

# ...blockchain
# ...Block class definition

miner_address = "q3nf394hjg-random-miner-address-34nf3i4nflkn3oi"

def proof_of_work(last_proof):
  # Create a variable that we will use to find
  # our next proof of work
  incrementor = last_proof + 1
  # Keep incrementing the incrementor until
  # it's equal to a number divisible by 9
  # and the proof of work of the previous
  # block in the chain
  while not (incrementor % 9 == 0 and incrementor % last_proof == 0):
    incrementor += 1
  # Once that number is found,
  # we can return it as a proof
  # of our work
  return incrementor

@node.route('/mine', methods = ['GET'])
def mine():
  # Get the last proof of work
  last_block = blockchain[len(blockchain) - 1]
  last_proof = last_block.data['proof-of-work']
  # Find the proof of work for
  # the current block being mined
  # Note: The program will hang here until a new
  #       proof of work is found
  proof = proof_of_work(last_proof)
  # Once we find a valid proof of work,
  # we know we can mine a block so 
  # we reward the miner by adding a transaction
  this_nodes_transactions.append(
    { "from": "network", "to": miner_address, "amount": 1 }
  )
  # Now we can gather the data needed
  # to create the new block
  new_block_data = {
    "proof-of-work": proof,
    "transactions": list(this_nodes_transactions)
  }
  new_block_index = last_block.index + 1
  new_block_timestamp = this_timestamp = date.datetime.now()
  last_block_hash = last_block.hash
  # Empty transaction list
  this_nodes_transactions[:] = []
  # Now create the
  # new block!
  mined_block = Block(
    new_block_index,
    new_block_timestamp,
    new_block_data,
    last_block_hash
  )
  blockchain.append(mined_block)
  # Let the client know we mined a block
  return json.dumps({
      "index": new_block_index,
      "timestamp": str(new_block_timestamp),
      "data": new_block_data,
      "hash": last_block_hash
  }) + "\n"

Теперь мы можем контролировать количество блоков, добываемых в определенный период времени, и мы можем выпустить новые монеты для людей в сети, чтобы отправить друг другу. Но, как мы сказали, мы только делаем это только на одном компьютере. Если блокировки децентрализованы, как мы убедитесь, что та же цепь на каждом узле? Для этого мы заставляем каждый узел транслировать свою версию цепочки для других и позволить им получать цепочки других узлов. После этого каждый узел должен проверить сети других узлов, чтобы каждый узел в сети может прийти к консенсусу того, как будет выглядеть полученная блокчан. Это называется Алгоритм консенсуса Отказ

Наш консенсус-алгоритм будет довольно простым: если цепь узла отличается от другого (то есть есть конфликт), то самая длинная цепочка в сети остается и все более короткие цепи будут удалены. Если между цепями в нашей сети нет конфликта между цепями, то мы продолжаем.

@node.route('/blocks', methods=['GET'])
def get_blocks():
  chain_to_send = blockchain
  # Convert our blocks into dictionaries
  # so we can send them as json objects later
  for block in chain_to_send:
    block_index = str(block.index)
    block_timestamp = str(block.timestamp)
    block_data = str(block.data)
    block_hash = block.hash
    block = {
      "index": block_index,
      "timestamp": block_timestamp,
      "data": block_data,
      "hash": block_hash
    }
  # Send our chain to whomever requested it
  chain_to_send = json.dumps(chain_to_send)
  return chain_to_send

def find_new_chains():
  # Get the blockchains of every
  # other node
  other_chains = []
  for node_url in peer_nodes:
    # Get their chains using a GET request
    block = requests.get(node_url + "/blocks").content
    # Convert the JSON object to a Python dictionary
    block = json.loads(block)
    # Add it to our list
    other_chains.append(block)
  return other_chains

def consensus():
  # Get the blocks from other nodes
  other_chains = find_new_chains()
  # If our chain isn't longest,
  # then we store the longest chain
  longest_chain = blockchain
  for chain in other_chains:
    if len(longest_chain) < len(chain):
      longest_chain = chain
  # If the longest chain wasn't ours,
  # then we set our chain to the longest
  blockchain = longest_chain

Мы почти сделаны сейчас. После запуска Полный сервер Snakecoin Запустите следующие команды в вашем терминале. Предполагая, что у вас установлен CURL.

  1. Создать транзакцию.
curl "localhost:5000/txion" \
     -H "Content-Type: application/json" \
     -d '{"from": "akjflw", "to":"fjlakdj", "amount": 3}'
  1. Мой новый блок.
curl localhost:5000/mine
  1. Проверьте результаты. От окна клиента мы видим это.

С небольшим количеством симпатичной печати мы видим, что после добычи мы получаем какую-то классную информацию о нашем новом блоке.

{
  "index": 2,
  "data": {
    "transactions": [
      {
        "to": "fjlakdj",
        "amount": 3,
        "from": "akjflw"
      },
      {
        "to": "q3nf394hjg-random-miner-address-34nf3i4nflkn3oi",
        "amount": 1,
        "from": "network"
      }
    ],
    "proof-of-work": 36
  },
  "hash": "151edd3ef6af2e7eb8272245cb8ea91b4ecfc3e60af22d8518ef0bba8b4a6b18",
  "timestamp": "2017-07-23 11:23:10.140996"
}

И это все! На данный момент мы сделали довольно размером блокчан. Теперь SnakeCoin может быть запущен на нескольких машинах для создания сети, а реальные сонакекиины могут быть добыты. Пожалуйста, не стесняйтесь Tinker с Код Snakecoin Server Как бы вы хотели, и спросите столько вопросов, сколько вам нужно! В следующей части мы обсудим создание кошелька SnakeCoin, поэтому пользователи могут отправлять, получать и хранить свои SnakeCoins.

Большое спасибо за чтение! Twitter , Github С Snapchat , Средний , Instagram.

Оригинал: “https://dev.to/aunyks/lets-make-the-tiniest-blockchain-bigger”