ホームページ  >  記事  >  バックエンド開発  >  PHPはブロックチェーンを構築します(ソースコードを含む)

PHPはブロックチェーンを構築します(ソースコードを含む)

烟雨青岚
烟雨青岚オリジナル
2020-06-13 18:07:275378ブラウズ

PHPはブロックチェーンを構築します(ソースコードを含む)

php はブロックチェーン (ソース コードを含む) を構築します

PHP プログラミング言語を使用して構築しますブロックチェーン、ブロックチェーン自体は非常に単純な概念であり、非常に単純なデータ構造です。デジタル通貨は非常に複雑ですが、ブロックチェーンはそうではありません。ブロックチェーンが複雑である理由は、コンセンサスアルゴリズム、マイニングメカニズム、およびそれらで実行されるすべてです。しかし、ブロックチェーン自体は理解するのが非常に簡単です。ブロックチェーンがどのように機能するかを本当に理解する前に、何を知っておく必要がありますか?ハッシュとは何ですか?それらはどのように機能するのでしょうか?

ハッシュは基本的に、ある種のデータのデジタル署名です。たとえば、映画を撮ってハッシュしてデジタル署名を取得したり、電子メールを撮ってハッシュしてデジタル署名を取得したりできます。デジタル署名 ; 単語を取得してハッシュ化することもできます。任意のデータを取得してハッシュ化すると、ハッシュ値を取得できます。データにデジタル署名するだけです。

このハッシュは実際にはどのように機能するのでしょうか?詳しく見てみましょう。

PHP でブロックチェーンを構築します。これは非常に簡単です。プログラミングを少し知っていれば、何も知らなくても別の言語で行うこともできます。プログラミングについては、まだどのように機能するかについては大体理解できると思いますので、ハッシュについて話しましょう。

<?php
    $list1 = ["a","b","c"];
    $list2 = ["a","b","c"];
    echo "list 1: ".md5(serialize($list1));
    echo "<br/>list 2: ".md5(serialize($list2));
?>

ご覧のとおり、2 つのリストがあります。a、b、c を含む 2 つのリストがあります。これがデータで、これがハッシュしようとしている文字列です。何を見てみましょうリスト 1 と 2 から得られるデジタル署名の種類。

出力結果:

list 1: ec10e0c7a344da191700ab4ace1a5e26
list 2: ec10e0c7a344da191700ab4ace1a5e26

これら 2 つのハッシュ文字列またはデジタル署名を取得すると、これら 2 つは同じであることがわかります。

list1 の内容を変更すると、たとえば:

<?php
    $list1 = ["aaa","b","c"]; //Changed
    $list2 = ["a","b","c"];
    echo "list 1: ".md5(serialize($list1));
    echo "<br/>list 2: ".md5(serialize($list2));
?>

これを実行します:

list 1: 97f4361000fdba1732a50f1771c9d830
list 2: ec10e0c7a344da191700ab4ace1a5e26

Completely が得られることがわかります。異なるデジタル署名なので、ちょっとした変更を加えるだけで、データに手を加えるだけで、このリストの何かを変更しようとすると、まったく異なるデジタル署名が得られます。これがブロックチェーン技術の基礎です。ブロックチェーンはブロックのリストであり、基本的にはブロックのリンクされたリストであり、各ブロックは前のブロックのデジタル署名を保持し、次のブロックのデジタル署名は現在のブロックのデジタル署名に基づいているため、ブロックは常にリンクされています。次の署名は現在の署名に基づいており、現在の署名は前の署名に基づいているため、過去に何かを変更すると、すべての署名が破壊され、見た目がまったく違ったものになります。

コーディング方法

実際にブロックチェーンのコーディングに入りましょう。最初に行う必要があるのは、Block クラスについて説明することです。この場合は、私たちのブロックは非常に単純で、含まれるものは 3 つだけです。このブロックで発生したトランザクションのリストが含まれます。前のブロックの以前のハッシュまたはデジタル署名が含まれます。また、ハッシュ自体も含まれます。ハッシュはトランザクションと前のハッシュに基づいているため、誰かが前のブロックで何かを変更すると、現在のブロックのデジタル署名が変更され、次のブロックのデジタル署名も変更されます。

お気に入りの IDE を使用して空の PHP プロジェクトを再生成します。私はローカルホスト環境で XAMPP を使用します。

ここで、新しいファイル block.php を作成し、その中に次のコード スニペットを挿入します。

<?php
    class Block{
              private $previousHash;
              private $transactions=[];
              private $blockHash;
              function __construct($previousHash,$transactions){
                             $this->previousHash = $previousHash;
                             $this->transactions = $transactions;
                             $contents = [md5(serialize($transactions)),$previousHash];
                             $this->blockHash = md5(serialize($contents));
              }
              function getPreviousHash(){
                             return $this->previousHash;
              }
              function getTransactions(){
                             return $this->transactions;
              }
              function getBlockHash(){
                             return $this->blockHash;
              }
    }
?>

次に、index.php という名前の別のファイルを作成し、block.php クラスを使用していくつかのブロックを作成します。

index.php

<?php
    include("block.php");
    $genesisTransaction = ["a sends 11 bitcoins to b","b sends 44 bitcoins to c"];
    $genenisBlock = new Block(0, $genesisTransaction);
    $block1Transaction = ["a sends 11 bitcoins to b","b sends 44 bitcoins to c"];
    $block1 = new Block($genenisBlock->getBlockHash(), $block1Transaction);
    $block2Transaction = ["a sends 11 bitcoins to b","b sends 44 bitcoins to c"];
    $block2 = new Block($block1->getBlockHash(), $block2Transaction);
    echo "Genesis Block: ".$genenisBlock->getBlockHash();
    echo "<br/>Block 1: ".$block1->getBlockHash();
    echo "<br/>Block 2: ".$block2->getBlockHash();
?>

出力結果:

Genesis Block: d9c559b57e148b19802d8e70555f0303
Block 1: 29e9e5a309aae81243fdf73112253c74
Block 2: fbff8f664f6b4069bf7288cb1b86cb3a

現在のハッシュが以前のハッシュに基づいていることを確認してください。ハッシュ、以前のトランザクションを変更すると、すべてのデジタル署名が有効になります。たとえば、genesisTransaction で 11 を 12 に変更すると、次のようにまったく異なる出力になります:

<?php
    include("block.php"); 
    $genesisTransaction = ["a sends 12 bitcoins to b","b sends 44 bitcoins to c"]; //changed 11 to 12
    $genenisBlock = new Block(0, $genesisTransaction);
    $block1Transaction = ["a sends 11 bitcoins to b","b sends 44 bitcoins to c"];
    $block1 = new Block($genenisBlock->getBlockHash(), $block1Transaction);
    $block2Transaction = ["a sends 11 bitcoins to b","b sends 44 bitcoins to c"];
    $block2 = new Block($block1->getBlockHash(), $block2Transaction);
    echo "Genesis Block: ".$genenisBlock->getBlockHash();
    echo "<br/>Block 1: ".$block1->getBlockHash();
    echo "<br/>Block 2: ".$block2->getBlockHash();
?>

出力結果:

Genesis Block: d9c559b57e148b19802d8e70555f0303
Block 1: 29e9e5a309aae81243fdf73112253c74
Block 2: fbff8f664f6b4069bf7288cb1b86cb3a

你可以看到任何一个交易的变化,在一个块中的任何一个数据将传播和改变未来的区块链中所有的数字签名,这就是区块链的工作原理,因为如果我改变了什么,每个人都会看到我的数字签名完全不同于其他人,所以这意味着我在欺骗别人。就如同我告诉每个人,嘿,一个人给了我很多比特币,这里是区块链,请每个人确认下。每个人将查看它并说清楚,我们知道这个区块链无法确认这一点,因为我们有自己版本的区块链,数字签名会是完全不同,所以这不行。

我希望你能理解通过它们的数字签名将区块的哈希链接在一起的这一基本概念。在你的PHP中实现这个例子吧。

本文转自:https://blog.csdn.net/mongo_node/article/details/81700425

推荐教程:《php教程

以上がPHPはブロックチェーンを構築します(ソースコードを含む)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。