php构建⼀个区块链(含源码)
构建⼀个区块链(含源码)
我们要⽤PHP编程语⾔构建区块链,区块链本⾝就是⼀个⾮常简单的概念,它是⼀个⾮常简单的数据结构,是很复杂,但区块链不是,它们复杂的原因是共识算法,挖矿机制和运⾏在他们之上的⼀切,但区块链本⾝是很容易理解的,在你真正了解区块链是如何⼯作的之前,你需要知道什么,你需要知道什么是哈希hash?它们是如何⼯作的?
哈希基本上是某种数据的数字签名,例如可以拍⼀部电影,可以hash它并得到⼀个数字签名;可以拿⼀封电⼦邮件,可以把它hash并得到⼀个数字签名;还可以拿⼀个字,也可以hash它,你可以拿任何数据,然后hash它,你都可以得到⼀个hash值。它只是对该数据进⾏数字签名。
这个hash哈希实际上是如何⼯作的?让我们深⼊了解下。
我们将在PHP中构建区块链,这将⾮常简单,如果你懂⼀点⼉编程,你也可以⽤另⼀种语⾔来做,如果你不懂编程,我想你仍然能够⼤致理解它是如何⼯作的,所以让我们来谈谈哈希hash。
list 2: ".md5(serialize($list2));
>
正如你所看到的,我们有两个列表,我们有两个包含a、b、c的列表,这是数据,这是我们试图hash的字符串,让我们看看我们从列表1和2中得到什么样的数字签名。
输出结果:
list 1: ec10e0c7a344da191700ab4ace1a5e26
list 2: ec10e0c7a344da191700ab4ace1a5e26
你可以看到,当我们得到这两个哈希字符串或数字签名,这两个是相同的。
如果我现在改变list1中的内容,例如:
list 2: ".md5(serialize($list2));
>
现在我在运⾏它:
list 1: 97f4361000fdba1732a50f1771c9d830
list 2: ec10e0c7a344da191700ab4ace1a5e26
你可以看到我们得到了完全不同的数字签名,所以如果我只是做⼀个⼩的修改,我只是⼲预数据,我试图改变这个列表中的任何东西,我将得到完全不同的数字签名,这是区块链技术的基础,因为区块链是⼀个块的列表,基本上是⼀个由区块组成的链表和每个块保持前⼀个块的数字签名,并且下⼀个块的数字签名是基于当前块的数字签名,所以它们总是关联在⼀起,下⼀个签名将基于当前签名⽽当前签名是基于以前的签名,所以如果你改变过去的任何东西,你会打破所有的签名,他们将看起来完全不同。
如何编码
让我们实际进⼊我们的区块链编码,我们需要做的第⼀件事是谈论我们的Block类,在这种情况下,我们的块将⾮常简单,它只包含三个东西,它将包含在该块中发⽣的交易列表,它将包含先前的哈希或数字签名的前⼀个块,它也将包含哈希的本⾝,这个哈希将基于交易和以前的哈希,所以如果任何⼈改变任何东西在前⼀块,数字签名的当前块将改变,并改变下⼀个块的数字签名。
使⽤你喜欢的IDE重新⽣成空的PHP项⽬,我在本地主机环境中使⽤XAMPP。
现在创建⼀个新的⽂件block.php,并在其中放⼊下⾯的代码⽚段。
nstruct($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;
}
php好看主页源码function getBlockHash(){
return $this->blockHash;
}
}
>
现在创建另⼀个名为index.php的⽂件,并使⽤block.php类来创建⼀些块。
index.php
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 "
Block 1: ".$block1->getBlockHash();
echo "
Block 2: ".$block2->getBlockHash();
>
输出结果:
Genesis Block: d9c559b57e148b19802d8e70555f0303
Block 1: 29e9e5a309aae81243fdf73112253c74
Block 2: fbff8f664f6b4069bf7288cb1b86cb3a
请看当前哈希将基于以前的哈希,如果你改变了任何先前的交易,你的所有数字签名将⽣效,例如,在genesisTransaction中,我改变了11到12,它将输出完全不同的,如:
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 "
Block 1: ".$block1->getBlockHash();
echo "
Block 2: ".$block2->getBlockHash();
>
输出结果:
Genesis Block: d9c559b57e148b19802d8e70555f0303
Block 1: 29e9e5a309aae81243fdf73112253c74
Block 2: fbff8f664f6b4069bf7288cb1b86cb3a
你可以看到任何⼀个交易的变化,在⼀个块中的任何⼀个数据将传播和改变未来的区块链中所有的数字签名,这就是区块链的⼯作原理,因为如果我改变了什么,每个⼈都会看到我的数字签名完全不同于其他⼈,所以这意味着我在欺骗别⼈。就如同我告诉每个⼈,嘿,⼀个⼈给了我很多⽐特币,这⾥是区块链,请每个⼈确认下。每个⼈将查看它并说清楚,我们知道这个区块链⽆法确认这⼀点,因为我们有⾃⼰版本的区块链,数字签名会是完全不同,所以这不⾏。
我希望你能理解通过它们的数字签名将区块的哈希链接在⼀起的这⼀基本概念。在你的PHP中实现这个例⼦吧。
以上就是php构建⼀个区块链(含源码)的详细内容,更多请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论