php构建区块链的方法

发布时间:2020-06-15 14:11:53 作者:小新
来源:亿速云 阅读:195

今天小编给大家分享的是php构建区块链的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。

区块链

区块链(Blockchain)是借由密码学串接并保护内容的串连交易记录(又称区块),是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。

php构建一个区块链(含源码)

我们要用PHP编程语言构建区块链,区块链本身就是一个非常简单的概念,它是一个非常简单的数据结构,数字货币是很复杂,但区块链不是,它们复杂的原因是共识算法,挖矿机制和运行在他们之上的一切,但区块链本身是很容易理解的,在你真正了解区块链是如何工作的之前,你需要知道什么,你需要知道什么是哈希hash?它们是如何工作的?

哈希基本上是某种数据的数字签名,例如可以拍一部电影,可以hash它并得到一个数字签名;可以拿一封电子邮件,可以把它hash并得到一个数字签名;还可以拿一个字,也可以hash它,你可以拿任何数据,然后hash它,你都可以得到一个hash值。它只是对该数据进行数字签名。

php构建区块链的方法

这个hash哈希实际上是如何工作的?让我们深入了解下。

我们将在PHP中构建区块链,这将非常简单,如果你懂一点儿编程,你也可以用另一种语言来做,如果你不懂编程,我想你仍然能够大致理解它是如何工作的,所以让我们来谈谈哈希hash。

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

正如你所看到的,我们有两个列表,我们有两个包含a、b、c的列表,这是数据,这是我们试图hash的字符串,让我们看看我们从列表1和2中得到什么样的数字签名。

输出结果:

list 1: ec10e0c7a344da191700ab4ace1a5e26
list 2: ec10e0c7a344da191700ab4ace1a5e26

你可以看到,当我们得到这两个哈希字符串或数字签名,这两个是相同的。

如果我现在改变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

你可以看到我们得到了完全不同的数字签名,所以如果我只是做一个小的修改,我只是干预数据,我试图改变这个列表中的任何东西,我将得到完全不同的数字签名,这是区块链技术的基础,因为区块链是一个块的列表,基本上是一个由区块组成的链表和每个块保持前一个块的数字签名,并且下一个块的数字签名是基于当前块的数字签名,所以它们总是关联在一起,下一个签名将基于当前签名而当前签名是基于以前的签名,所以如果你改变过去的任何东西,你会打破所有的签名,他们将看起来完全不同。

如何编码

让我们实际进入我们的区块链编码,我们需要做的第一件事是谈论我们的Block类,在这种情况下,我们的块将非常简单,它只包含三个东西,它将包含在该块中发生的交易列表,它将包含先前的哈希或数字签名的前一个块,它也将包含哈希的本身,这个哈希将基于交易和以前的哈希,所以如果任何人改变任何东西在前一块,数字签名的当前块将改变,并改变下一个块的数字签名。

使用你喜欢的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中实现这个例子吧。

以上就是php构建区块链的方法的简略介绍,当然详细使用上面的不同还得要大家自己使用过才领会。如果想了解更多,欢迎关注亿速云行业资讯频道哦!

推荐阅读:
  1. golang[41]-区块链-默克尔树构建
  2. Dockerfile构建PHP镜像的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php 区块链

上一篇:如何学习Ruby

下一篇:如何解决layui时间控件无法正常使用的问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》