php構建一個區塊鏈

php構建一個區塊鏈(含源碼)
  咱們要用PHP編程語言構建區塊鏈,區塊鏈自身便是一個十分簡略的概念,它是一個十分簡略的數據結構,數字錢銀是很雜亂,但區塊鏈不是,它們雜亂的原因是共識算法,挖礦機制和運轉在他們之上的全部,但區塊鏈自身是很簡略理解的,在你真實瞭解區塊鏈是怎麼作業的之前,你需求知道什麼,你需求知道什麼是哈希hash?它們是怎麼作業的?
  哈希基本上是某種數據的數字簽名,例如能夠拍一部電影,能夠hash它並得到一個數字簽名;能夠拿一封電子郵件,能夠把它hash並得到一個數字簽名;還能夠拿一個字,也能夠hash它,你能夠拿任何數據,然後hash它,你都能夠得到一個hash值。它僅僅對該數據進行數字簽名。
  這個hash哈希實際上是怎麼作業的?讓咱們深化了解下。
  咱們將在PHP中構建區塊鏈,這將十分簡略,假如你懂一點兒編程,你也能夠用另一種語言來做,假如你不懂編程,我想你依然能夠大致理解它是怎麼作業的,所以讓咱們來談談哈希hash。
  list1=["a","b","c"];  list1=["a","b","c"];   list2=[“a”,“b”,“c”];
  echo"list1:".md5(serialize(list1));  echo"  list2:".md5(serialize(list1));   echo"   list2:".md5(serialize(list2));
  ?>
  正如你所看到的,咱們有兩個列表,咱們有兩個包括a、b、c的列表,這是數據,這是咱們企圖hash的字符串,讓咱們看看咱們從列表1和2中得到什麼樣的數字簽名。
  輸出成果:
  list1:ec10e0c7a344da191700ab4ace1a5e26
  list2:ec10e0c7a344da191700ab4ace1a5e26
  你能夠看到,當咱們得到這兩個哈希字符串或數字簽名,這兩個是相同的。
  假如我現在改動list1中的內容,例如:
  list1=["aaa","b","c"];//Changed  list1=["aaa","b","c"];//Changed   list2=[“a”,“b”,“c”];
  echo"list1:".md5(serialize(list1));  echo"  list2:".md5(serialize(list1));   echo"   list2:".md5(serialize(list2));
  ?>
  現在我在運轉它:
  list1:97f4361000fdba1732a50f1771c9d830
  list2:ec10e0c7a344da191700ab4ace1a5e26
  你能夠看到咱們得到了徹底不同的數字簽名,所以假如我僅僅做一個小的修改,我僅僅干預數據,我企圖改動這個列表中的任何東西,我將得到徹底不同的數字簽名,這是區塊鏈技能的根底,因爲區塊鏈是一個塊的列表,基本上是一個由區塊組成的鏈表和每個塊堅持前一個塊的數字簽名,而且下一個塊的數字簽名是根據當時塊的數字簽名,所以它們總是相關在一起,下一個簽名將根據當時簽名而當時簽名是根據曾經的簽名,所以假如你改動曩昔的任何東西,你會打破一切的簽名,他們將看起來徹底不同。
  怎麼編碼
  讓咱們實際進入咱們的區塊鏈編碼,咱們需求做的第一件事是議論咱們的Block類,在這種情況下,咱們的塊將十分簡略,它只包括三個東西,它將包括在該塊中發生的買賣列表,它將包括從前的哈希或數字簽名的前一個塊,它也將包括哈希的自身,這個哈希將根據買賣和曾經的哈希,所以假如任何人改動任何東西在前一塊,數字簽名的當時塊將改動,並改動下一個塊的數字簽名。
  運用你喜愛的IDE從頭生成空的PHP項目,我在本地主機環境中運用XAMPP。
  現在創立一個新的文件block.php,並在其中放入下面的代碼片段。
  classBlock{
  privatepreviousHash;  privatepreviousHash;   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=previousHash;  previousHash;   this->transactions=transactions;  transactions;   contents=[md5(serialize(transactions)),transactions)),previousHash];
  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”];
  genenisBlock=newBlock(0,genenisBlock=newBlock(0,genesisTransaction);
  block1Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"];  block1Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"];   block1=newBlock(genenisBlock>getBlockHash(),genenisBlock->getBlockHash(),block1Transaction);
  block2Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"];  block2Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"];   block2=newBlock(block1>getBlockHash(),block1->getBlockHash(),block2Transaction);
  echo"GenesisBlock:".genenisBlock>getBlockHash();  echo"  Block1:".genenisBlock->getBlockHash();   echo"   Block1:".block1->getBlockHash();
  echo"
  Block2:".block2>getBlockHash();  ?>    GenesisBlock:d9c559b57e148b19802d8e70555f0303  Block1:29e9e5a309aae81243fdf73112253c74  Block2:fbff8f664f6b4069bf7288cb1b86cb3a  genesisTransaction1112  include("block.php");  block2->getBlockHash();   ?>   輸出成果:   GenesisBlock:d9c559b57e148b19802d8e70555f0303   Block1:29e9e5a309aae81243fdf73112253c74   Block2:fbff8f664f6b4069bf7288cb1b86cb3a   請看當時哈希將根據曾經的哈希,假如你改動了任何從前的買賣,你的一切數字簽名將收效,例如,在genesisTransaction中,我改動了11到12,它將輸出徹底不同的,如:   include("block.php");   genesisTransaction=[“asends12bitcoinstob”,“bsends44bitcoinstoc”];//changed11to12
  genenisBlock=newBlock(0,genenisBlock=newBlock(0,genesisTransaction);
  block1Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"];  block1Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"];   block1=newBlock(genenisBlock>getBlockHash(),genenisBlock->getBlockHash(),block1Transaction);
  block2Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"];  block2Transaction=["asends11bitcoinstob","bsends44bitcoinstoc"];   block2=newBlock(block1>getBlockHash(),block1->getBlockHash(),block2Transaction);
  echo"GenesisBlock:".genenisBlock>getBlockHash();  echo"  Block1:".genenisBlock->getBlockHash();   echo"   Block1:".block1->getBlockHash();
  echo"
  Block2:".$block2->getBlockHash();
  ?>
  輸出成果:
  GenesisBlock:d9c559b57e148b19802d8e70555f0303
  Block1:29e9e5a309aae81243fdf73112253c74
  Block2:fbff8f664f6b4069bf7288cb1b86cb3a
  你能夠看到任何一個買賣的變化,在一個塊中的任何一個數據將傳達和改動未來的區塊鏈中一切的數字簽名,這便是區塊鏈的作業原理,因爲假如我改動了什麼,每個人都會看到我的數字簽名徹底不同於其他人,所以這意味着我在欺騙別人。就如同我告訴每個人,嘿,一個人給了我很多比特幣,這裏是區塊鏈,請每個人承認下。每個人將查看它並說清楚,咱們知道這個區塊鏈無法承認這一點,因爲咱們有自己版本的區塊鏈,數字簽名會是徹底不同,所以這不行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章