助力在线教育,阿里云推出百万专项扶持基金计划
云棲號:https://yqh.aliyun.com
第一手的上云資訊,不同行業精選的上云企業案例庫,基于眾多成功案例萃取而成的最佳實踐,助力您上云決策!
前話
提供一個思路幫助你了解區塊鏈基礎運作,文本并不是一個完整的區塊鏈,希望你能舉一反三
源碼:ar414-com/phpblock
記住
區塊鏈是一個 不可變的、有序的 被稱為塊的記錄鏈。它們可以包含交易、文件或任何您喜歡的數據。但重要的是,他們用哈希 一起被鏈接在一起
需要準備什么?
- php5.6+
1、Block 區塊
塊是什么樣的?
每個塊都有一個索引,一個時間戳(Unix時間戳),一個事務列表, 一個校驗(工作證明算法生成的證明)和前一個塊的哈希。
block = {'index': 2,'timestamp': 1506057125,'transactions': [{'sender': "8527147fe1f5426f9dd545de4b27ee00",'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f",'amount': 5,}], 'proof': 324984774000,'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" }在這一點上,一個 區塊鏈 的概念應該是明顯的 - 每個新塊都包含在其內的前一個塊的 哈希 。 這是至關重要的,因為這是 區塊鏈 不可改變的原因:如果攻擊者損壞 區塊鏈 中較早的塊,則所有后續塊將包含不正確的哈希值。
新建一個Block類,區塊鏈由N個區塊組成,在區塊鏈里,價值信息存儲在區塊之中。比如,比特幣的區塊存儲交易記錄,而交易記錄是任何加密貨幣的核心。除此之外,區塊里還包含有技術信息,比如它的版本號,當前的時間戳,以及上一個區塊的哈希(Hash)。
<?php /*** Created by PhpStorm.* User: ar414.com@gmail.com* Date: 2020/2/2* Time: 18:42*/class Block {/*** @var integer 索引*/private $index;/*** @var integer 時間戳*/private $timestamp;/*** @var array 事務列表*/private $transactions;/*** @var string 上一塊的哈希值*/private $previousHash;/*** @var integer 由工作證明算法生成的證明*/private $proof;/*** @var string 當前塊的哈希值*/private $hash;/*** 通過調用方法返回新生成塊的哈希* 防止外界改動* @return string*/public function getHash(){return $this->hash;}public function __construct($index,$timestamp,$transactions,$previousHash,$proof){$this->index = $index;$this->timestamp = $timestamp;$this->transactions = $transactions;$this->previousHash = $previousHash;$this->proof = $proof;$this->hash = $this->blockHash();}/*** 當前塊簽名* @return string*/private function blockHash(){//我們必須確保這個字典(區塊)是經過排序的,否則我們將會得到不一致的哈希值$blockArray = ['index' => $this->index,'timestamp' => $this->timestamp,'transactions' => $this->transactions,'proof' => $this->proof,'previous_hash' => $this->previousHash];$blockString = json_encode($blockArray);return hash('sha256',$blockString);} }- index是當前塊的索引
- timestamp是當前塊的生成時間
- transactions是當前塊的交易事務列表(有多個或一個交易)
- previousHash是上一個區塊的簽名哈希
- hash是當前區塊的簽名哈希
- proof是當前區塊的礦工工作量證明
proof
使用工作量證明(PoW)算法,來證明是如何在區塊鏈上創建或挖掘新的區塊。PoW 的目標是計算出一個符合特定條件的數字,這個數字對于所有人而言必須在計算上非常困難,但易于驗證。這是工作證明背后的核心思想。
在比特幣中,工作量證明算法被稱為 Hashcash ,它和上面的問題很相似,只不過計算難度非常大。這就是礦工們為了爭奪創建區塊的權利而爭相計算的問題。 通常,計算難度與目標字符串需要滿足的特定字符的數量成正比,礦工算出結果后,就會獲得一定數量的比特幣獎勵(通過交易)
2、創建一個區塊鏈
我們要創建一個Blockchain類 ,他的構造函數創建了一個初始化的空列表(要存儲我們的區塊鏈)并且創建世紀快,以及初始化了事務列表。下面是我們這個類的實例:
Step 1:初始化區塊列表并且創建創世塊
/*** @var array 區塊列表*/private $chain;/*** @var array 交易事務列表*/private $currentTransactions;public function __construct(){$this->chain = [$this->createGenesisBlock()];$this->currentTransactions = [];}/*** 創建創世塊* @return array*/private function createGenesisBlock(){$block = ['index' => 1,'timestamp' => time(),'transactions' => [],'proof' => 100,'previous_hash' => '0000000000000000000000000000000000000000000000000000000000000000',//參考BTC的第一個創世塊];$block['hash'] = (new Block($block['index'],$block['timestamp'],$block['transactions'],$block['previous_hash'],$block['proof']))->getHash();return $block;}Step 2:新增交易事務
創建一筆新的交易到交易事務列表中等待新區塊打包,每次生成新區塊后清空列表
/*** 新增交易事務* @param $senderPrivateKey* @param $senderAddress* @param $recipientAddress* @param $amount* @return bool*/public function createTransaction($senderPrivateKey,$senderAddress,$recipientAddress,$amount){$row = ['from' => $senderAddress,'to' => $recipientAddress,'amount' => $amount,'timestamp' => time()];//TODO 私鑰簽名(就像支票簽名)//TODO 區塊鏈節點可以用發送者的簽名來推導出公鑰,再通過公鑰驗簽并對比數據$this->currentTransactions[] = $row;return true;}Step 3:創建新區塊
當前示例創建新區快操作只能由挖礦成功的礦工操作,挖礦講解在Step4
/*** 增加新區塊* @param int $proof* @return bool*/public function addBlock(int $proof){//上一個區塊的信息$preBlockInfo = $this->chain[count($this->chain)-1];//驗證工作證明if($this->checkProof($proof,$preBlockInfo['proof']) == false){return false;}//TODO 獎勵礦工(在交易事務中)$block = ['index' => count($this->chain) + 1,'timestamp' => time(),'transactions' => $this->currentTransactions,'proof' => $proof,'previous_hash' => $preBlockInfo['hash'],'hash' => ''];$block['hash'] = (new Block($block['index'],$block['timestamp'],$block['transactions'],$block['previous_hash'],$block['proof']))->getHash();//新增區塊$this->chain[] = $block;//重置交易事務$this->currentTransactions = [];return true;}/*** 校驗算力* @param string $proof* @param string $preProof* @return bool*/private function checkProof(string $proof,string $preProof){$string = $proof.$preProof;$hash = hash('sha256',$string);if(substr($hash,0,4) == '0000'){return true;}else{return false;}}Step 4:挖礦
挖礦正是神奇所在,它很簡單,做了一下三件事:
在比特幣中,工作量證明算法被稱為 Hashcash ,它和上面的問題很相似,只不過計算難度非常大。這就是礦工們為了爭奪創建區塊的權利而爭相計算的問題。 通常,計算難度與目標字符串需要滿足的特定字符的數量成正比,礦工算出結果后,就會獲得一定數量的比特幣獎勵(通過交易)
讓我們來實現一個相似 PoW 算法
找到一個數字 P ,使得它與前一個區塊的 Proof 拼接成的字符串的 Hash 值以 4 個零開頭。 /*** 挖礦* @return void*/public function mine(){ // while (true) // {$proof = 0;//最新區塊$blockInfo = $this->chain[count($this->chain)-1];$preProof = $blockInfo['proof'];while (true){$string = $proof.$preProof;$hash = hash('sha256',$string);if(substr($hash,0,4) == '0000'){//增加新區塊$this->addBlock($proof);break;}$proof++;}// }}Step 5:運行測試
$blockChainObj = new Blockchain();//增加事務 $blockChainObj->createTransaction('','8527147fe1f5426f9dd545de4b27ee00','a77f5cdfa2934df3954a5c7c7da5df1f',1);//開啟挖礦(挖到則生成新區塊) $blockChainObj->mine();//查看當前區塊列表 $blockList = $blockChainObj->getChainList(); var_dump($blockList);//結果: $ php Blockchain.php array(2) {[0]=>array(6) {["index"]=>int(1)["timestamp"]=>int(1580717292)["transactions"]=>array(0) {}["proof"]=>int(100)["previous_hash"]=>string(64) "0000000000000000000000000000000000000000000000000000000000000000"["hash"]=>string(64) "567b2848f3ff87a614b3ba5ddc13389d4d7440699b1857935412561721d86d05"}[1]=>array(6) {["index"]=>int(2)["timestamp"]=>int(1580717292)["transactions"]=>array(1) {[0]=>array(4) {["from"]=>string(32) "8527147fe1f5426f9dd545de4b27ee00"["to"]=>string(32) "a77f5cdfa2934df3954a5c7c7da5df1f"["amount"]=>int(1)["timestamp"]=>int(1580717292)}}["proof"]=>int(28)["previous_hash"]=>string(64) "567b2848f3ff87a614b3ba5ddc13389d4d7440699b1857935412561721d86d05"["hash"]=>string(64) "3a599c88ddd60fb25605df33d33b19252117c3d7d0e70c66dbc45ed81ab295a9"} }Setp5:完整代碼ar414-com/phpblock
云棲號在線課堂,每天都有產品技術專家分享
立即加入圈子:https://c.tb.cn/F3.Z8gvnK
與專家面對面,及時了解課程最新動態!
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的助力在线教育,阿里云推出百万专项扶持基金计划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国际免费版 新冠疫情数据分析APP正式发
- 下一篇: 如何为Kubernetes实现原地升级