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