主页 > 最新imtoken官网下载地址 > 200行代码教你写出属于自己的区块链!
200行代码教你写出属于自己的区块链!
“区块链”一词无疑是过去一年最火的投资概念。 随着比特币等区块链资产价格的大幅上涨1个比特币代码样子,普通投资者对区块链及数字货币投资的兴趣也越来越浓厚。 突然之间,似乎全世界都在谈论区块链和比特币。
区块链就像是对全人类经济层面的入侵。 这种入侵可能比互联网的入侵更彻底。 人们开始传递的不是简单的信息和消费习惯,而是对资产和选择的新认识。
区块链难懂?这里有新手指南
我不明白为什么人们觉得很难理解区块链,我想知道为什么我不明白。
那是在 2013 年,我第一次听说比特币(是的,为时已晚)。 穷得连个都买不起,看完这篇文章你可能已经失恋了。
后来想了解一下它依赖的底层技术,就是区块链。 但是因为太忙,所以很久没有启动(那就没有启动和不启动之分了)。
什么是“区块链”?
区块链其实就是两个东西:一个是块,一个是链。 说白了,就是区块链。
因为它是存在于计算机中的东西,我们可以确定它的物理形态是什么样子的,即数字信息被分成块,然后这些块被链接起来。
例如下图中的每个方块代表一个国家,每个方块中包含对应国家的城市名称。
等等,还有更多。 这里的每个方块都是一个叫做散列的东西。 散列是一串字符(例如“1hi515AHA5H”)。
哈希是从块中包含的信息派生的。 USA 立方体包含纽约、洛杉矶和芝加哥等城市,因此它的散列类似于“NYLAC”(技术上与它相去甚远,但你明白了它的要点)。
每个连续的块都将包含前一个块的哈希值,因此这是将它们绑定在一起的(强制性)纽带。
如果有人篡改了第一个区块并添加了波士顿市,则新的哈希值将是“NYLACB”。
然而,已经存储在印度后续区块中的哈希仍然是“NYLAC”,这种不匹配将导致链条断裂。 所以散列的目的是确保没有人可以篡改区块。
那么如果有人修改了一个区块的内容,然后更新了后续区块的哈希值呢?
这也是可能的,但有一件事我还没有告诉你。 区块链的数据不仅仅存在于一台电脑中。 计算机中的区块链数据是骗不了人的,因为它会被复制到网络中每个用户的计算机中。
如果您加入区块链网络,您的计算机将下载区块数据。 如果有人篡改了他拥有的版本,整个网络也会考虑大多数人计算机拥有的版本。 正确的。
还有一点,在一个区块链网络中,不仅是数据,甚至整个系统的程序都被复制到所有的计算机上。
大多数互联网应用都是中心化的,比如Facebook1个比特币代码样子,她的数据和程序都放在她的服务器上,你的电脑会单独从Facebook的服务器上获取你需要知道的信息。
但是在区块链的世界里,中心是没有的,它依赖于用户的电脑来容纳自己的程序。 这意味着如果整个区块链网络中的每一台计算机都关闭,区块链系统就会死亡。
公共区块链
这是否意味着区块链系统实际上是由一群心甘情愿地让计算机保持运行的好心人组成的? 这些防篡改块用于什么?
区块链网络的好处是无穷无尽的。 比特币是一种数据货币和支付系统。 它在其防篡改区块中所持有的只是所有交易的分类帐。 那些贡献自己的计算机的人被称为矿工。 该系统将为他们提供比特币作为奖励。
以太坊还有一个附加功能。 它可以承载你的代码,从零开始开发一个区块链系统。
并且构建您自己的系统可能非常困难(请记住,这取决于有人为您牺牲他们的计算机性能)。 以太坊维护着这些昂贵的算力,你需要为这些算力消耗买单。
区块链应用不一定是支付系统或加密货币。 它可以是任何东西,比如社交网络、LiveEdu 等学习平台等。
私人区块链
比特币、以太坊等都是任何人都可以参与的公共区块链的例子。
那么如果我们想要一个私有区块链网络怎么办? 有些人想要私有区块链做什么? 那么请看下面的故事。
马克和莎拉
马克已经五个月没有付房租了。 当萨拉向他要时,他说他稍后会给她。 她请不起律师,而法院执行诉讼需要八个月甚至一年的时间,所以唯一的选择就是说服马克。
乔的生意
乔是一名商人,他经常要与不同的公司做生意。 几个月前,他与零售商签订了合同,但即使合同条款已经履行,零售商仍拒绝付款。
这些人利用法律制度的漏洞游说乔少付钱。 乔以前有过这方面的经验,在某些情况下他会上法庭,但这样做会损失他自己花费的时间和金钱的利润。
我们怎样才能帮助莎拉和乔?
我们可以在别处解决这个问题吗? 就Sara而言,我们需要让Mark按月支付租金,这实际上是一个基于时间的触发器。 您的日历程序使用此类触发器为您提供已安排事件的通知。
在Joe遇到的场景中,一旦满足合约中的条款,双方就必须付款,这实际上是一种基于条件的触发机制。 想一想,你上次从亚马逊购买电子书时,你是否必须先确认付款,然后亚马逊才会将电子书寄给你?
关键是,计算机程序始终如一地执行这样的指令。 当你点击这篇文章,向下滚动,等等,它会跟着做。 为了帮助 Sara,我们需要将合同条款翻译成代码。
Sara 和 Mark 之间智能合约的伪代码
如果今天的日期是 30,则不支付租金
从 Mark 的账户转 $500 到 Sara 的账户
但是我们在哪里部署这些代码呢? 它应该部署到所有参与者的计算机上。 Sara 和 Mark 的银行都将成为这个私有区块链网络的一部分。
Joe 和 Sara 会签署一个编码协议(即智能合约),然后这个协议会被分发到网络中,Mark 和 Sara 的银行都会有一份。
每个月的 30 号,当时钟滴答到 12 点时,约定的金额将从 Mark 的账户转入 Sara 的账户。 Joe 还开始使用智能合约来强制他的客户支付约定的款项。
萨拉很高兴,因为她不必再担心马克是否会按照承诺支付房租。 乔也很高兴,因为他不用去法院讨个说法,省下所有的精力就可以继续发展自己的事业。
私有区块链仅限于参与业务的各方,因此 Joe 不会成为 Sara 和 Mark 所属的区块链网络的一部分。
前进的道路
你现在是不是对这个有点概念了? 如果还不明白,可以看小编之前发表的文章,不过下面这篇文章也可以让你秒懂区块链。
区块链和裸照:分散的色情网站是什么样的?
“区块链”的概念开始流行起来。 虽然大多数人对“区块链”充满好奇,甚至贪婪,但其中很多人还处于懵懂的阶段。 也和圈内的几个人见面,深入聊了聊,想写一篇“入门级”的区块链介绍文章给大家。
为了便于理解,我决定以牺牲自己的名誉为代价,用一个充满荷尔蒙的比喻。 因为科技浪潮确实每次都性感到让人荷尔蒙爆炸,性(huang)感(bao)的内容开始了。
以前大家想看陈老师的裸照都要上一个叫1025的网站,就是集中。
后来1025网站被和谐了,大部分猥琐男都傻到没有网站看电影,因为他们太相信中心化组织了,活该打个“澳门皇家赌场”的小广告” 每天 1025 点弹出。
不过没关系,陈先生的2100张裸照就保存在100万猥琐男的电脑里。 除非地球毁灭,否则陈先生的裸照不会消失。 这就是去中心化,数据的分布式存储。
后来有个超级猥琐男叫“中本初”,是陈先生2100裸照的超级好友。 为了让这2100张照片永不消失,让世人共享,他制作了一个网络共享文件夹“Mr. Chen plus”。
猥琐男要想获得“陈老师plus”2100张照片的查看权,必须加入电子协议:不得对“陈老师plus”中的任何照片进行复制、修改、抄袭。 任何行为都会被时间戳记录下来!
例如“2018年1月9日中午12:00,查看了103号照片,13:00删除了100张编号为1-100的照片……”
小张的行为被录下来,广播给其他100万猥琐男。 “陈先生plus”的2100张照片将受到保护。 猥琐男电脑里的数据,恢复小张电脑里的数据……
小张绝不会试图修改和破坏“陈先生plus”,他的所有行为都会同时记录在其他猥琐男的电脑里。
这就是区块链,数据是去中心化存储的,去中心化的,所有的行为都通过时间戳进行广播和记录。 修改、破坏、篡改数据源是不可能的,除非100万猥琐男的电脑同时炸毁,或者互联网消失,或者世界毁灭……
当然,只有一种特殊情况是可以添加“陈先生plus”文件夹中的照片。 这种情况被称为“区块链共识层”。 不能盲目增加。
中本聪在最初设立协议时表示,“猥琐男可以在每年XX时间用X相机拍摄陈先生的裸照,前100张照片可以添加到‘陈先生plus’文件夹中” photos”,那么,“Mr. Chen plus”每年可以增长100张照片。
当然,你也可以给照片估价,发行“陈先生加”币。 因为“陈小姐plus”中的每一张照片都无法篡改和损坏,所以都是独一无二的,都有独立的编号。 我们会珍惜每一张照片,难道不值得吗? 就像现实世界无法复制的名画一样!
如何估算? 就搞个所谓的ICO(Initial Coin Offering),就是我和李古来老师成立一个基金,开个新闻发布会,说我们给这2100张照片估值1.05亿! 每张照片50,000!
投5050万订阅前1100张照片吧,其他猥琐男可以众筹5000万买剩下的1000张照片。 不想要? 卖给我和李古来基金就行了。 我们认为它很有价值。 我们太棒了,我们不会骗你。
自从有了区块链——我们不再害怕1025人作恶,给我们弹小广告,给我们发病毒; 我们不再害怕陈老师的照片丢失或被破坏,连1984大哥复活都做不到。 ....
当然,也有麻烦,就是现在那些炒作名画的,都来炒作“陈先生plus”的照片,把价格弄得非常高。
还有更可怜的。 为了赚钱,拍了一堆裸照,按照这个模式做了一个“某某老师plus”模仿收韭菜。
看到这里,你肯定能看懂区块链了…… 最后,教你如何用200行Go代码写出属于自己的区块链!
只用 200 行 Go 代码编写你自己的区块链
本文旨在帮助您使用Go语言实现一个简单的区块链,用不到200行的代码揭示区块链的原理!
“用不到 200 行 Go 代码实现你自己的区块链!” 听起来不错? 有什么比开发自己的区块链更好的学习和实践方式呢? 那我们一起练习吧!
因为我们是一家从事医疗保健领域的科技公司,所以本文以人体静息心跳数据(BPM心率)作为示例数据。
我们先从一分钟内数一下你的心跳开始,然后写下来,这个数字可能会用在后面的内容中。
通过本文,您将能够:
但是,本文不涉及工作量证明 (PoW) 和权益证明 (PoS) 等共识算法。
同时,为了让您更清楚地查看区块链和区块的添加,我们简化了网络交互的过程。 “跨网广播”的过程等关于P2P网络的内容将在下一篇文章中补充。 开始吧!
设置
我们假设你已经有一点 Go 语言开发的经验。 安装配置Go开发环境后,我们需要获取如下依赖:
去获取 github.com/davecgh/go-spew/spew
spew可以帮助我们在控制台直接查看struct和slice这两个数据结构。
去获取 github.com/gorilla/mux
Gorilla 的 mux 包非常流行,我们用它来编写 web 处理程序。
去获取 github.com/joho/godotenv
Godotenv可以帮助我们读取项目根目录下的.env配置文件,这样我们就不用硬编码http端口等配置到代码中了。 例如像这样:
地址=8080
接下来,我们创建一个 main.go 文件。 之后我们的大部分工作都围绕这个文件展开,所以让我开始编码吧!
导入依赖
我们以声明方式导入所有依赖项:
数据模型
接下来,让我们定义一个结构来表示构成区块链的每个块的数据模型:
接下来,我们定义一个结构来表示整个链。 最简单的表示是块切片:
var Blockchain []块
我们使用哈希算法(SHA256)来确定和维护链中块和块的正确顺序,确保每个块的 PrevHash 值等于前一个块中的 Hash 值,从而使链构建在正确的块顺序:
哈希和生成块
为什么我们需要哈希? 主要有两个原因:
然后我们编写一个函数来计算给定数据的 SHA256 哈希值:
calculateHash函数接受一个区块,通过区块中的Index、Timestamp、BPM、PrevHash值计算SHA256哈希值。
然后我们可以移植一个生成块的函数:
其中,Index是从给定的上一个区块的Index开始递增,时间戳是直接通过time.Now()函数得到的,Hash值是通过上一个calculateHash函数计算出来的,PrevHash是给定的上一个区块的Hash值的块。
奇偶块
区块生成完成后,我们需要一个函数来帮助我们判断一个区块是否被篡改。 检查Index看区块是否正确递增,检查PrevHash是否和上一个区块的Hash一致,再通过calculateHash检查当前区块的Hash值是否正确。
通过这几步,我们可以写出一个验证函数:
除了检查区块之外,我们还会遇到一个问题:两个节点都产生区块并添加到各自的链中,那么我们应该判断谁呢? 细节留到下一篇,在这里记住一个原则:永远选择最长的链。
一般来说,更长的链意味着它的数据(状态)更新了,所以我们需要一个函数可以帮助我们将本地过期链切换到最新链:
至此,我们基本完成了所有重要的功能。 接下来,我们需要一种方便直观的方式来查看我们的链,包括数据和状态。 通过浏览器查看网页可能是最合适的方式!
网页服务
我想你一定对传统的Web服务和开发非常熟悉,所以你一定能看懂这部分内容。
使用 Gorilla/mux 包,让我们首先编写一个函数来初始化我们的网络服务:
通过上面提到的.env获取端口号,加上一些基本的配置参数,web服务就已经可以监听和服务了!
接下来,让我们定义不同的端点和相应的处理程序。 例如,对“/”的 GET 请求允许我们查看整个链,对“/”的 POST 请求创建块。
GET 请求的处理程序:
为了简单起见,我们直接以JSON格式返回整条链,可以在浏览器访问localhost:8080或127.0.0.1:8080查看(这里的8080是.env中定义的端口号ADDR)。
POST 请求的处理程序有点复杂,让我们先定义 POST 请求的负载:
查看处理程序的实现:
上面定义的 payload 可以用在我们的 POST 请求体中,例如:
{“BPM”:75}
还记得我们之前写的 generateBlock 函数吗? 它采用“上一个块”参数和 BPM 值。
POST处理程序接受请求后,可以获取请求体中的BPM值,然后借助生成块函数和验证块函数生成新的块!
此外,您还可以:
POST请求处理完成后,无论区块创建成功与否,我们都需要向客户端返回一个响应:
快完成了
接下来,我们“组装”这些区块链相关的功能和Web服务功能:
这里的genesisBlock是main函数中最重要的部分,通过它初始化区块链,毕竟第一个块的PrevHash为空。
哦耶!完成
你可以在这里获得完整的代码:Github repo[1]
让我们开始吧:
去运行 main.go
在终端中,我们可以看到web服务器启动的日志信息,并打印出创世块的信息:
然后我们打开浏览器访问地址localhost:8080,可以看到页面上显示了当前整个区块链的信息(当然目前只有一个创世块):
接下来,我们通过 POSTMAN 发送一些 POST 请求:
刚才刷新页面,现在链上多了一些块,是我们刚刚生成的,可以看到块的顺序和哈希值都是正确的。
下一步
我们刚刚完成了自己的区块链。 虽然它非常简单(笨拙),但它具有出块、哈希计算、区块验证等基本能力。
接下来可以继续深入学习区块链的其他重要知识,比如工作量证明、权益证明等共识算法,或者智能合约、Dapps、侧链等。
目前这个实现不包含任何P2P网络内容,我们会在下一篇文章中加入这部分内容,当然我们鼓励大家在此基础上自己动手实践!
来源:开源中国、唯物主义、高可用架构等微信公众号综合整理
国内首个区块链实战课程上线! 让您了解如何在企业中实施区块链去中心化项目,助您快速掌握技能升值加薪! 现在注册立减 1,000 美元! 席位有限,快来一探究竟吧!