Блокчейн, где код создает доверие. (Биткойн)

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

Содержание

  • Что такое Блокчейн?
  • Что такое биткойн?
  • Как создается Биткойн?
  • Что такое алгоритм консенсуса и как его использовать?
  • Что это за «Головоломка» и где все это написано?
  • использованная литература
  • Вывод

Что такое Блокчейн?

Блокчейн — это распределенная цифровая книга (растущий список записей), называемая блоками, которые связаны с помощью криптографии. После записи/проверки данные, хранящиеся в блоках, никогда не могут быть изменены/модифицированы. более
Публичный блокчейн является безграничным, открытым, нейтральным, глобальным и устойчивым к цензуре.

Что такое биткойн?

Чисто одноранговая версия электронных денег позволит отправлять онлайн-платежи напрямую от одной стороны к другой, минуя финансовое учреждение.

Белая книга Биткойн:

Биткойн — это децентрализованная цифровая валюта, которая позволяет осуществлять мгновенные платежи любому человеку в любой точке мира. Проверка транзакций, безопасность и выдача денег осуществляются сетью (майнерами) коллективно в обмен на небольшую комиссию за транзакцию.

Код Биткойн имеет открытый исходный код (с лицензией MIT), что означает, что любой может использовать его с изменениями или без них. Он доступен на Гитхаб.

В Биткойне каждый блок содержит криптографический хеш предыдущего блока, отметку времени и данные транзакции. Просмотрев код блок.ч подтверждает это утверждение.

/** Nodes collect new transactions into a block, hash them into a hash tree,
 * and scan through nonce values to make the block's hash satisfy proof-of-work
 * requirements.  When they solve the proof-of-work, they broadcast the block
 * to everyone and the block is added to the block chain.  The first transaction
 * in the block is a special one that creates a new coin owned by the creator
 * of the block.
 */
class CBlockHeader
{
public:
    // header
    int32_t nVersion;
    uint256 hashPrevBlock;
    uint256 hashMerkleRoot;
    uint32_t nTime;
    uint32_t nBits;
    uint32_t nNonce;
  ...
   // Check out rest of the code on github.

Как создается Биткойн?

Биткойн создается с помощью процесса, называемого майнингом. Посредством майнинга майнеры (особый тип узлов в сети биткойнов) получают определенное расчетное количество биткойнов в качестве стимула (новые биткойны) и комиссию за транзакцию за каждую транзакцию в блоке или с последнего блока для обеспечения безопасности. сети и проверки транзакций.

Это вознаграждение рассчитывается заранее (половина каждые 4 года или после 210 000 блоков) и добавляется к блоку в качестве первой транзакции самим узлом майнинга. Эта специальная транзакция называется транзакцией coinebase.

Майнеры проверяют новые транзакции и записывают их в глобальную бухгалтерскую книгу (блокчейн). Они используют специальный алгоритм для создания нового блока и добавления его в блокчейн. Этот специальный алгоритм называется алгоритмом консенсуса.

Что такое алгоритм консенсуса и как его использовать?

Алгоритм консенсуса (общее соглашение) создает доверие в сети блокчейн. PoW (Proof of Work) — это алгоритм консенсуса, лежащий в основе биткойна.

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

Что это за «Головоломка» и где все это написано?

Существует не так много информации (в форме блогов или статей) о коде, который фактически помещается в эти блокчейны (в нашем случае — биткойн). Давайте поговорим об этой головоломке и посмотрим, где это написано.

Как уже говорилось, биткойн является открытым исходным кодом, и его код доступен на Гитхаб. Биткойн написан на языке программирования C++.

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

Глядя на обозреватель блокчейна blockchain.com

Снимок экрана 2019-02-15 в 12.31.02 PM.png

Как видите, анонс в этом блоке был 89761782. Уведомление увеличивается в mining.cpp биткойн-кода.
Из исходного кода майнинг.cpp

UniValue generateBlocks(std::shared_ptr<CReserveScript> coinbaseScript, int nGenerate, uint64_t nMaxTries, bool keepScript)
{
    static const int nInnerLoopCount = 0x10000;
    int nHeightEnd = 0;
    int nHeight = 0;

  	// Visit the link above to see the complete code.
        while (nMaxTries > 0 && pblock->nNonce < nInnerLoopCount && !CheckProofOfWork(pblock->GetHash(), pblock->nBits, Params().GetConsensus())) {
            ++pblock->nNonce;
            --nMaxTries;
        }
        if (nMaxTries == 0) {
            break;
        }
        if (pblock->nNonce == nInnerLoopCount) {
            continue;
        }
        // Visit the link above to see the complete code.

Кодовая база Биткойна ОГРОМНА, поэтому давайте посмотрим на пару файлов и посмотрим, что там.

Из исходного кода pow.cpp (Доказательство работы)

unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params)
{	
  // params defined in the chainparams.cpp
    assert(pindexLast != nullptr);
    unsigned int nProofOfWorkLimit = UintToArith256(params.powLimit).GetCompact();

    // Only change once per difficulty adjustment interval
    if ((pindexLast->nHeight+1) % params.DifficultyAdjustmentInterval() != 0)
    {
        if (params.fPowAllowMinDifficultyBlocks)
        {
            // Special difficulty rule for testnet:
            // If the new block's timestamp is more than 2* 10 minutes
            // then allow mining of a min-difficulty block.
            if (pblock->GetBlockTime() > pindexLast->GetBlockTime() + params.nPowTargetSpacing*2)
                return nProofOfWorkLimit;
            else
            {
                // Return the last non-special-min-difficulty-rules-block
                const CBlockIndex* pindex = pindexLast;
                while (pindex->pprev && pindex->nHeight % params.DifficultyAdjustmentInterval() != 0 && pindex->nBits == nProofOfWorkLimit)
                    pindex = pindex->pprev;
                return pindex->nBits;
            }
        }
        return pindexLast->nBits;
    }

    // Go back by what we want to be 14 days worth of blocks
    int nHeightFirst = pindexLast->nHeight - (params.DifficultyAdjustmentInterval()-1);
    assert(nHeightFirst >= 0);
    const CBlockIndex* pindexFirst = pindexLast->GetAncestor(nHeightFirst);
    assert(pindexFirst);

    return CalculateNextWorkRequired(pindexLast, pindexFirst->GetBlockTime(), params);
}

Какие факторы влияют на алгоритм Proof of Work в биткойнах?
Из исходного кода параметры.h

struct Params {
  ...
 /** Proof of work parameters */
    uint256 powLimit;
    bool fPowAllowMinDifficultyBlocks;
    bool fPowNoRetargeting;
    int64_t nPowTargetSpacing;
    int64_t nPowTargetTimespan;
    int64_t DifficultyAdjustmentInterval() const { return nPowTargetTimespan / nPowTargetSpacing; }
    uint256 nMinimumChainWork;
  // ...
}

chainparams.h

consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
consensus.nPowTargetSpacing = 10 * 60;
consensus.fPowAllowMinDifficultyBlocks = false;
consensus.fPowNoRetargeting = false;
// ...
// The best chain should have at least this much work.
consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000028822fef1c230963535a90d");

Код Биткойна находится в общедоступном репозитории GitHub. https://github.com/bitcoin/биткойн. Любой может это увидеть, любой может разветвить его и создать новый собственный блокчейн (что многие и сделали). Продолжайте проверять код. Если вы хотите внести свой вклад, создайте проблемы или прокомментируйте существующие проблемы, чтобы поделиться своим мнением, или отправьте запросы на извлечение.

использованная литература

Вывод

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

Спасибо, что прочитали этот пост — надеюсь, он был полезен.
Больше постов:

Обо мне

Я соучредитель Oc2 (загрузочный стартап на основе блокчейна), я работаю в криптопространстве уже год. Я посвятил все свое время изучению огромных возможностей, которые блокчейн может предложить этому миру. Не стесняйтесь обращаться.

Вы можете найти меня на Гитхаб, LinkedIn и КодМентор.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *