助力在线教育,阿里云推出百万专项扶持基金计划

云栖号: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:挖矿

挖矿正是神奇所在,它很简单,做了一下三件事:

  1. 计算工作量证明 PoW
  2. 通过新增一个交易授予矿工(自己)一个币
  3. 构造新区块并将其添加到链中

在比特币中,工作量证明算法被称为 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
与专家面对面,及时了解课程最新动态!

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开发者成长】阿里代码缺陷检测探索与实践

目前PRECFIX技术已经在阿里巴巴集团内部落地并获得好评&#xff1b;关于“PRECFIX”技术的论文被国际软件工程大会&#xff08;ICSE&#xff09;收录。 张昕东(别象) 阿里巴巴 云研发事业部 算法工程师 【以下为别象分享实录】 阿里巴巴在缺陷检测技术方面遇到的三个挑战 编码…

docker Harbor2.3.4 https 搭建镜像仓库

文章目录一、环境准备1. 环境要求2. 节点总览3. 安装docker-compose二、安装harbor2.1. 下载2.2. 解压2.3. 认证2.4. 调整配置2.5. 安装 harbor2.6. 配置host2.7. 效果验证三、客户端3.1. 证书保存3.2. 新建配置3.3. 登录harbor四、基本操作4.1. 下线4.2. 监控状态4.3. 重新部署…

OPPO实时数仓揭秘:从顶层设计实现离线与实时的平滑迁移

一、建设背景 关于 OPPO 移动互联网业务 大家都认为 OPPO 是一家手机公司&#xff0c;但大家可能并不清楚&#xff0c;其实 OPPO 也会做与移动互联网相关的业务。在 2019 年 12 月&#xff0c;OPPO 发布了自己定制的手机操作系统 ColorOS 7.0 版本。目前包括海外市场在内&…

十年技术骨干面试被开出一万五薪资,直呼 “这是对我的侮辱”

老周是我十多年前认识的同事&#xff0c;2012年前后&#xff0c;老周到北京工作的第一个任务就是为公司的产品开发IOS APP。2012年底&#xff0c;老周已经能熟练的驾驭苹果的cocoatouch和android核心组件。也正因为如此&#xff0c;老周的薪水直接翻倍&#xff0c;当时已经拿到…

微信小程序---实现弹窗效果

第一步&#xff1a;点击按钮触发弹窗事件 <button class"btn" bindtap"btn">按钮</button> *** css样式 .btn{ position: fixed; bottom: 0; left: 0; } *** js btn(){ let delshow !this.data.delshow console.log(delshow) this.setD…

登录 Harbor response from daemon: Get “https://192.168.92.129/v2/“: x509: cannot validate certificate

文章目录1. 现象2. 解决方案3. 重新登陆1. 现象 [rootlocalhost harbor]# docker login 192.168.92.129 Username: admin Password: Error response from daemon: Get "https://192.168.92.129/v2/": x509: cannot validate certificate for 192.168.92.129 becaus…

基于Flink的超大规模在线实时反欺诈系统的建设与实践

作者&#xff1a;关贺宇 在大数据时代&#xff0c;金融科技公司通常借助消费数据来综合评估用户的信用和还款能力。这个过程中&#xff0c;某些中介机构会搜集大量的号并进行“养号”工作&#xff0c;即在一年周期里让这些号形成正常的消费、通讯记录&#xff0c;目的是将这些…

别再被 Python 洗脑了!!

Python 作为一种解释型技术脚本语言&#xff0c;越来越被认可为程序员新时代的风口语言。无论是刚入门的程序员&#xff0c;还是年薪百万的 BATJ 的技术大牛都无可否认&#xff1a;Python的应用能力是成为一名码农大神的必要项。 而作为Python初学者来讲&#xff0c;最大的问题…

任务不再等待!玩转DataWorks资源组

引言 DataWorks提供了三种资源组的能力&#xff1a;独享资源组、自定义资源组和默认资源组&#xff0c;很多开发者在使用资源组时经常会碰到各类情况&#xff0c;到时候任务运行失败或者延迟&#xff0c;例如&#xff1a;1. 正在使用默认资源组&#xff0c;任务经常要等待2.购…

微信小程序---实现输入手机验证码功能

*** html部分 <view classcontainer> <view classmain-title bindtap"test"> 输入短信验证码 </view> <view class"sub-title"> 已向<text class"phone">139****9999</text>发送验证码 </view> <…

Docker Harbor 2.3.4 集群 双主复制高可用镜像仓库

下面操作大部分是双节点同时执行一样的命令&#xff0c;不同的地方我会进行标注和特殊说明 文章目录一、环境准备1. 环境要求2. 节点总览3. 安装docker-compose二、安装harbor2.1. 下载2.2. 解压2.3. 调整配置2.4. 安装 harbor2.5. 效果验证三、Docker开启远程API3.1. 修改配置…

如何用Chrome读懂网站监测Cookie

作者 | 朱顺意责编 | 李雪敬出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;网站监测工具用于标识用户的 Cookie 分为第1方 Cookie 和第3方 Cookie&#xff0c;这两者本质上没有什么区别&#xff0c;只是身份不同。Cookie 有 Domain 属性&#xff0c;当 Coo…

DataWorks百问百答01:数据同步该用什么资源组

引子 很多用户在使用数据集成建立同步任务时&#xff0c;往往都会困惑一个设置&#xff0c;即“资源组设置”。 大家常有的疑问是“资源组是用来做什么的&#xff1f;跟网络之间什么关系&#xff1f;我该选择那种资源组&#xff1f;” 下面本文给您一个简要的介绍。 什么是资源…

在阿里,40岁的奋斗姿势

在阿里&#xff0c;40岁的奋斗姿势 在阿里&#xff0c;什么样的年纪可以称为老呢&#xff1f;35岁&#xff1f; 在云网络&#xff0c;有这样一群人&#xff0c;他们的平均年龄接近40&#xff0c;却刚刚开辟职业生涯的第二战场。 他们的奋斗姿势是什么样的呢&#xff1f; 洛神…

nginx配置多个conf文件

今天整理了下&#xff0c;在centos 7.6 系统下怎么配置多个conf文件。 step 1:在nginx.conf文件所在目录新建conf.d目录&#xff0c;即mkdir conf.d&#xff0c;为确保权限能够访问到 chmod 777 conf.dstep 2:编辑nginx.conf文件&#xff0c;内容为&#xff1a; #user nobody…

CPU有个禁区,内核权限也无法进入!

来源 | 编程技术宇宙封图 | CSDN 下载自视觉中国神秘项目我是CPU一号车间的阿Q&#xff0c;是的&#xff0c;我又来了。最近一段时间&#xff0c;我几次下班约隔壁二号车间虎子&#xff0c;他都推脱没有时间&#xff0c;不过也没看见他在忙个啥。前几天&#xff0c;我又去找他&…

Vue---淘宝镜像cnpm---安装vue-cli

1. 淘宝镜像命令 npm install -g cnpm --registryhttps://registry.npm.taobao.org 2. 安装vue-cli脚手架 npm install -g vue/cli 3.vue-cli脚手架更新 npm i -g vue/cli 4. 查看当前vue-cli版本号 vue -V

防删库实用指南 | 只需一步,快速召回被误删的表

数据库的一些非常不错的企业级功能都是“养兵千日&#xff0c;用兵一时”&#xff0c;比如Oracle 10g中的回收站&#xff08;Recycle Bin&#xff09;功能&#xff0c;可以在特殊情况下发挥特种兵的功能&#xff0c;比如当你删除一个表空间、一个用户&#xff08;Schema)时&…

智能化中的控制与自动化中的控制不同

智能化中的控制相对于自动化中的控制更加灵活、智能、综合和学习能力强。智能化控制系统能够根据实际情况进行自主决策和优化&#xff0c;适用范围更广&#xff0c;效果更好。 首先&#xff0c;智能化控制系统能够根据外部环境的变化和实时数据的反馈来自主调整和优化控制策略&…

Flink on Zeppelin (4) - 机器学习篇

今天我来讲下如何在 Zeppelin 里做机器学习。机器学习的重要性我就不多说了&#xff0c;我们直奔主题。 Flink 在机器学习这个领域发力较晚&#xff0c;社区版没有一个完整的机器学习算法库可以用&#xff0c;Alink[1]是目前 Flink 生态圈相对比较完整的机器学习算法库&#x…