开发自己的区块链基础功能篇
准备工作:
- 安装go开发环境
- 用go搭建web服务
- go语言基础
安装go开发环境
到https://golang.org/dl/这个地址下载对应的安装包,mac ,windows,linux都有(需要科学上网)。以mac为例,下载成功后双击安装下一步即可,很简单。安装成功后运行go version查看版本(如果没有的话,就重启一下终端)
用go搭建web服务
在这里咱们用的是Gorilla/mux包。步骤:
- 创建NewRouter
- 设置端口号
- 设置http的参数字典
- 调用ListenAndServe方法,启动服务
go语言基础
- 导包:多个包用小括号括起来 a. import ( "sync" "time" )
- 使用点调用方法: a. time.Now()
- 声明变量: a. var coin int 用空格隔开,类型写到后面,变量名写中间,最前面是个var b. coin := 10 也可以省略var,用:=来赋值,但是必须保证coin没有声明过,否则会报错 c. coin1,coin2 := 10,20 多变量声明是这样的
- 条件控制: a. if a<b { return 10 }else{ return 20 }
- 循环控制: a. for a := 0; a < 10; a++ {
fmt.Printf("a: %d\n", a) } - 函数定义,传参: a. /* 函数返回两个数的最大值 */ b. func max(num1, num2 int) int { } c. num1, num2 int表示两个整形参数,是可选的,也可以不填, d. 最后的int是返回值的类型 e. 调用函数通过这样方式:n := max(a, b)
- 结构体定义,赋值,调用: a. 定义:type Article struct { title string id int } b. 赋值:var a1 Article a1.title = "写代码" c. 调用:fmt.Printf( "title : %s\n", a1.title)
了解这些,今天的代码就能看懂了,当然go语言还有很多要学习的知识点,可以到这里来http://www.runoob.com/go/go-tutorial.html学习
整理思路:
根据之前了解的区块链原理,我们整理一下需要实现哪些方法:
- 一个区块需要包含哪些信息: a. Index :这个区块在整个链中的索引 b. Timestamp : 区块生成时的时间戳 c. Hash : 区块通过 SHA256 算法生成的哈希值 d. PrevHash : 前一个区块的 SHA256 哈希值 e. content : 需要记录的内容
- 计算哈希值的函数
- 生成新区块的函数
- 根据不可篡改性,我们还需要一个验证区块是否被篡改的函数
- 启动web服务的函数
创建区块结构体:
type Block struct {Index intTimestamp stringContent stringHash stringPrevHash string
}
复制代码
计算哈希值:(把区块结构体中的信息都拼在一起,然后Hash算出来)
func calculateHash(block Block) string {record := strconv.Itoa(block.Index) + block.Timestamp + block.Content + block.PrevHashh := sha256.New()h.Write([]byte(record))hashed := h.Sum(nil)return hex.EncodeToString(hashed)
}
复制代码
生成新区块:(上一个区块的索引加1,上一个区块的Hash赋值给当前区块的PrevHash,当前区块的Hash由calculateHash函数生成)
func generateBlock(oldBlock Block, Content string) Block {var newBlock Blockt := time.Now()newBlock.Index = oldBlock.Index + 1newBlock.Timestamp = t.String()newBlock.Content = ContentnewBlock.PrevHash = oldBlock.HashnewBlock.Hash = calculateHash(newBlock)return newBlock
}
复制代码
验证区块:(根据索引和Hash值判断,老索引加1应该等于新索引,新的PrevHash应该等于老的Hash,最后还要重新计算一个新区块的Hash,看是否和传过来的一样)
func isBlockValid(newBlock, oldBlock Block) bool {if oldBlock.Index+1 != newBlock.Index {return false}if oldBlock.Hash != newBlock.PrevHash {return false}if calculateHash(newBlock) != newBlock.Hash {return false}return true
}
复制代码
启动web服务:
//设置http需要的参数,并开启服务
func run() error {mux := makeMuxRouter()httpAddr := "8080"s := &http.Server{Addr: ":" + httpAddr,Handler: mux,ReadTimeout: 10 * time.Second,WriteTimeout: 10 * time.Second,MaxHeaderBytes: 1 << 20,}if err := s.ListenAndServe(); err != nil {return err}return nil
}//生成NewRouter对象
func makeMuxRouter() http.Handler {muxRouter := mux.NewRouter()muxRouter.HandleFunc("/", handleGetBlockchain).Methods("GET")muxRouter.HandleFunc("/", handleWriteBlock).Methods("POST")return muxRouter
}
复制代码
好的,需要的函数都已经列好,下面把它们组装起来即可,然后放到一个main.go的文件中,启动终端,进入到main.go文件夹并输入go run main.go命令。 打开http://localhost:8080/地址,会看到一个创世区块,如果想添加一个新区块则需要使用postman 传一个content参数过去,如图:
然后再刷新浏览器,会返回新的区块信息,如图:
好的,先到这里,下一次我们把共识算法加进去。
总结:
今天实现了生成新区块、哈希计算、区块校验这些基本功能。代码在:https://github.com/sunqichao/createblockchain
参考https://medium.com/@mycoralhealth/code-your-own-blockchain-in-less-than-200-lines-of-go-e296282bcffc
转载于:https://juejin.im/post/5aabab10f265da237b21d94a
开发自己的区块链基础功能篇相关推荐
- 【区块链开发指南】区块链基础之区块和交易
在区块链网络当中,所有的数据都以区块的形式记录在各个节点上.而每个区块又以单独的文件保存在节点本地磁盘上,在比特币(Linux系统)中所有的区块信息都保存在~/.bitcoin/blocks/目录下面 ...
- java玩转区块链-基础篇-账户
java玩转区块链-基础篇--账户 java环境配置 基础概念 账户 maven包引用 创建账户代码 代码解释 (1) (2) (3) (4) 可以不让搞,但是不允许你不会 java环境配置 jdk版 ...
- java玩转区块链-基础篇-solidity语法-基础类型
java玩转区块链-基础篇-solidity语法-基础类型 java环境配置 代码准备 maven 完整solidity 执行步骤 基础类型 布尔类型 类型标识: 字面常量值: 运算符: 短路规则: ...
- 【链块技术10期】区块链基础语言(二)——GO语言开发环境搭建
原文链接:区块链基础语言(二)--Go语言开发环境搭建 一.操作系统位数的查询方法 在安装前首先要了解个人的电脑系统位数是32位还是64位. 1.1Windows系统查询方法 右击"计算 ...
- 《区块链开发指南》一一第1章 区块链基础
第1章 区块链基础 区块链究竟是什么?狭义地说,区块链就是比特币的底层技术:不过,经过7年的发展,区块链已经不再"依附于"比特币,而是独立地发展成为了一种革命性的技术,比特币则是区 ...
- 面向 Java 开发人员的区块链链代码
面向 Java 开发人员的链代码简介 点击查看视频演示查看抄本 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger F ...
- 5分钟学会区块链 - 开发一条区块链 Develop BlockChain with Tendermint
本文攻略:解惑区块链开发,学习 Tendermint,给自己造一条区块链 建议玩家等级:技术小白,学生党,初级码农 阅读此文先解锁技能: 一点点命令行基础 一点点 GO 基础:三天包学会 一点点区块链 ...
- 区块链基础学习(一)
一.区块链简介 1.1.区块链与区块链技术 区块链是将记录(区块)通过密码学串联并加密的链式数据结构.而区块链技术,是通过P2P网络和区块链来实现数据存储的去中心化.不可逆和不可篡改.比特币正是构建在 ...
- java 区块链开发_Java开发人员的区块链入门
java 区块链开发 顶级技术专家将区块链列为十大新兴技术之一,它们有潜力在未来十年内改变我们的世界,这值得您花时间学习. 如果您是一名具有Java背景的开发人员,并且想快速了解区块链技术,那么本文将 ...
最新文章
- 安装npm出现Profile not found.的问题
- Markdown 语法简介
- 一站式Web开发套件BeetleX.WebFamily
- mysql数据库mha_MySQL高可用性大杀器之MHA
- vi/vim文本编辑器的使用
- springBoot+springSecurity 数据库动态管理用户、角色、权限
- Android中Parcelable和Serializable接口用法
- nginx php访问阻塞,php-cgi和php-fpm,Windows环境下解决Nginx+php并发访问阻塞问题。
- 计算机会计u8实验报告,会计信息系统实验报告 用友u8
- PMP-项目进度管理
- 三自由度机器人轨迹规划(两旋转+移动)
- 2022鹏业安装算量软件10大常见问题整理
- 采购入库单扫码校验,收货校验发现供应商送货错误。思迅安卓盘点机PDA
- 浅谈人工智能的伦理问题
- spool off参数详解
- HQL 报 return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask 错误解决方案
- ElasticSearch 命令
- Ubuntu20.04换为清华的镜像源
- C-获得文件大小并动态申请内存屏幕打印文件内容小程序
- fiddler和wireshark
热门文章
- JVM-12虚拟机性能监控与故障处理工具之【JDK的可视化工具-VisualVM】
- bug ava.sql.SQLException: No more data to read from socket
- 找不到jar包的解决方法
- nav 计算机网络_CTO下载-计算机网络课件(配套韩立刚老师课程).ppt
- 2021-01-10 Halcon初学者知识 【10】形状匹配 【二】模板的形状匹配
- mysql如果索引为uid间隙锁_mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)...
- python是目前计算机语言的主流吗_即便C++现在是增长最快的语言,为什么它不及Java、Python流行?...
- 22个超详细的 JS 数组方法
- 2021-03-12 Python基础核心概念 变量和简单数据类型
- linux 统计根目录下的文件日期和出现的频率