php构建一个区块链(含源码)
咱们要用PHP编程语言构建区块链,区块链自身便是一个十分简略的概念,它是一个十分简略的数据结构,数字钱银是很杂乱,但区块链不是,它们杂乱的原因是共识算法,挖矿机制和运转在他们之上的全部,但区块链自身是很简略理解的,在你真实了解区块链是怎么作业的之前,你需求知道什么,你需求知道什么是哈希hash?它们是怎么作业的?
哈希基本上是某种数据的数字签名,例如能够拍一部电影,能够hash它并得到一个数字签名;能够拿一封电子邮件,能够把它hash并得到一个数字签名;还能够拿一个字,也能够hash它,你能够拿任何数据,然后hash它,你都能够得到一个hash值。它仅仅对该数据进行数字签名。
这个hash哈希实际上是怎么作业的?让咱们深化了解下。
咱们将在PHP中构建区块链,这将十分简略,假如你懂一点儿编程,你也能够用另一种语言来做,假如你不懂编程,我想你依然能够大致理解它是怎么作业的,所以让咱们来谈谈哈希hash。
l i s t 1 = [ " a " , " b " , " c " ] ; list1=["a","b","c"]; list1=["a","b","c"]; list2=[“a”,“b”,“c”];
echo"list1:".md5(serialize( l i s t 1 ) ) ; e c h o " l i s t 2 : " . m d 5 ( s e r i a l i z e ( list1)); echo" list2:".md5(serialize( list1)); echo" list2:".md5(serialize(list2));
?>
正如你所看到的,咱们有两个列表,咱们有两个包括a、b、c的列表,这是数据,这是咱们企图hash的字符串,让咱们看看咱们从列表1和2中得到什么样的数字签名。
输出成果:
list1:ec10e0c7a344da191700ab4ace1a5e26
list2:ec10e0c7a344da191700ab4ace1a5e26
你能够看到,当咱们得到这两个哈希字符串或数字签名,这两个是相同的。
假如我现在改动list1中的内容,例如:
l i s t 1 = [ " a a a " , " b " , " c " ] ; / / C h a n g e d list1=["aaa","b","c"];//Changed list1=["aaa","b","c"];//Changed list2=[“a”,“b”,“c”];
echo"list1:".md5(serialize( l i s t 1 ) ) ; e c h o " l i s t 2 : " . m d 5 ( s e r i a l i z e ( list1)); echo" list2:".md5(serialize( list1)); echo" list2:".md5(serialize(list2));
?>
现在我在运转它:
list1:97f4361000fdba1732a50f1771c9d830
list2:ec10e0c7a344da191700ab4ace1a5e26
你能够看到咱们得到了彻底不同的数字签名,所以假如我仅仅做一个小的修改,我仅仅干预数据,我企图改动这个列表中的任何东西,我将得到彻底不同的数字签名,这是区块链技能的根底,因为区块链是一个块的列表,基本上是一个由区块组成的链表和每个块坚持前一个块的数字签名,而且下一个块的数字签名是根据当时块的数字签名,所以它们总是相关在一起,下一个签名将根据当时签名而当时签名是根据曾经的签名,所以假如你改动曩昔的任何东西,你会打破一切的签名,他们将看起来彻底不同。
怎么编码
让咱们实际进入咱们的区块链编码,咱们需求做的第一件事是议论咱们的Block类,在这种情况下,咱们的块将十分简略,它只包括三个东西,它将包括在该块中发生的买卖列表,它将包括从前的哈希或数字签名的前一个块,它也将包括哈希的自身,这个哈希将根据买卖和曾经的哈希,所以假如任何人改动任何东西在前一块,数字签名的当时块将改动,并改动下一个块的数字签名。
运用你喜爱的IDE从头生成空的PHP项目,我在本地主机环境中运用XAMPP。
现在创立一个新的文件block.php,并在其中放入下面的代码片段。
classBlock{
private p r e v i o u s H a s h ; p r i v a t e previousHash; private previousHash; privatetransactions=[];
privateKaTeX parse error: Expected group after '_' at position 22: …ash; function_̲_construct(previousHash,KaTeX parse error: Expected '}', got 'EOF' at end of input: …ansactions){ this->previousHash= p r e v i o u s H a s h ; previousHash; previousHash; this->transactions= t r a n s a c t i o n s ; transactions; transactions; contents=[md5(serialize( t r a n s a c t i o n s ) ) , transactions)), transactions)),previousHash];
t h i s − > b l o c k H a s h = m d 5 ( s e r i a l i z e ( this->blockHash=md5(serialize( this−>blockHash=md5(serialize(contents));
}
functiongetPreviousHash(){
returnKaTeX parse error: Expected 'EOF', got '}' at position 23: …reviousHash; }̲ functiongetT…this->transactions;
}
functiongetBlockHash(){
returnKaTeX parse error: Expected 'EOF', got '}' at position 20: …->blockHash; }̲ } ?> 现在创…genesisTransaction=[“asends11bitcoinstob”,“bsends44bitcoinstoc”];
g e n e n i s B l o c k = n e w B l o c k ( 0 , genenisBlock=newBlock(0, genenisBlock=newBlock(0,genesisTransaction);
b l o c k 1 T r a n s a c t i o n = [ " a s e n d s 11 b i t c o i n s t o b " , " b s e n d s 44 b i t c o i n s t o c " ] ; block1Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"]; block1Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"]; block1=newBlock( g e n e n i s B l o c k − > g e t B l o c k H a s h ( ) , genenisBlock->getBlockHash(), genenisBlock−>getBlockHash(),block1Transaction);
b l o c k 2 T r a n s a c t i o n = [ " a s e n d s 11 b i t c o i n s t o b " , " b s e n d s 44 b i t c o i n s t o c " ] ; block2Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"]; block2Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"]; block2=newBlock( b l o c k 1 − > g e t B l o c k H a s h ( ) , block1->getBlockHash(), block1−>getBlockHash(),block2Transaction);
echo"GenesisBlock:". g e n e n i s B l o c k − > g e t B l o c k H a s h ( ) ; e c h o " B l o c k 1 : " . genenisBlock->getBlockHash(); echo" Block1:". genenisBlock−>getBlockHash(); echo" Block1:".block1->getBlockHash();
echo"
Block2:". b l o c k 2 − > g e t B l o c k H a s h ( ) ; ? > 输 出 成 果 : G e n e s i s B l o c k : d 9 c 559 b 57 e 148 b 19802 d 8 e 70555 f 0303 B l o c k 1 : 29 e 9 e 5 a 309 a a e 81243 f d f 73112253 c 74 B l o c k 2 : f b f f 8 f 664 f 6 b 4069 b f 7288 c b 1 b 86 c b 3 a 请 看 当 时 哈 希 将 根 据 曾 经 的 哈 希 , 假 如 你 改 动 了 任 何 从 前 的 买 卖 , 你 的 一 切 数 字 签 名 将 收 效 , 例 如 , 在 g e n e s i s T r a n s a c t i o n 中 , 我 改 动 了 11 到 12 , 它 将 输 出 彻 底 不 同 的 , 如 : i n c l u d e ( " b l o c k . p h p " ) ; block2->getBlockHash(); ?> 输出成果: GenesisBlock:d9c559b57e148b19802d8e70555f0303 Block1:29e9e5a309aae81243fdf73112253c74 Block2:fbff8f664f6b4069bf7288cb1b86cb3a 请看当时哈希将根据曾经的哈希,假如你改动了任何从前的买卖,你的一切数字签名将收效,例如,在genesisTransaction中,我改动了11到12,它将输出彻底不同的,如: include("block.php"); block2−>getBlockHash(); ?> 输出成果: GenesisBlock:d9c559b57e148b19802d8e70555f0303 Block1:29e9e5a309aae81243fdf73112253c74 Block2:fbff8f664f6b4069bf7288cb1b86cb3a 请看当时哈希将根据曾经的哈希,假如你改动了任何从前的买卖,你的一切数字签名将收效,例如,在genesisTransaction中,我改动了11到12,它将输出彻底不同的,如: include("block.php"); genesisTransaction=[“asends12bitcoinstob”,“bsends44bitcoinstoc”];//changed11to12
g e n e n i s B l o c k = n e w B l o c k ( 0 , genenisBlock=newBlock(0, genenisBlock=newBlock(0,genesisTransaction);
b l o c k 1 T r a n s a c t i o n = [ " a s e n d s 11 b i t c o i n s t o b " , " b s e n d s 44 b i t c o i n s t o c " ] ; block1Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"]; block1Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"]; block1=newBlock( g e n e n i s B l o c k − > g e t B l o c k H a s h ( ) , genenisBlock->getBlockHash(), genenisBlock−>getBlockHash(),block1Transaction);
b l o c k 2 T r a n s a c t i o n = [ " a s e n d s 11 b i t c o i n s t o b " , " b s e n d s 44 b i t c o i n s t o c " ] ; block2Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"]; block2Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"]; block2=newBlock( b l o c k 1 − > g e t B l o c k H a s h ( ) , block1->getBlockHash(), block1−>getBlockHash(),block2Transaction);
echo"GenesisBlock:". g e n e n i s B l o c k − > g e t B l o c k H a s h ( ) ; e c h o " B l o c k 1 : " . genenisBlock->getBlockHash(); echo" Block1:". genenisBlock−>getBlockHash(); echo" Block1:".block1->getBlockHash();
echo"
Block2:".$block2->getBlockHash();
?>
输出成果:
GenesisBlock:d9c559b57e148b19802d8e70555f0303
Block1:29e9e5a309aae81243fdf73112253c74
Block2:fbff8f664f6b4069bf7288cb1b86cb3a
你能够看到任何一个买卖的变化,在一个块中的任何一个数据将传达和改动未来的区块链中一切的数字签名,这便是区块链的作业原理,因为假如我改动了什么,每个人都会看到我的数字签名彻底不同于其他人,所以这意味着我在欺骗别人。就如同我告诉每个人,嘿,一个人给了我很多比特币,这里是区块链,请每个人承认下。每个人将查看它并说清楚,咱们知道这个区块链无法承认这一点,因为咱们有自己版本的区块链,数字签名会是彻底不同,所以这不行。