准备工作:

  1. 安装go开发环境
  2. 用go搭建web服务
  3. go语言基础

安装go开发环境

到https://golang.org/dl/这个地址下载对应的安装包,mac ,windows,linux都有(需要科学上网)。以mac为例,下载成功后双击安装下一步即可,很简单。安装成功后运行go version查看版本(如果没有的话,就重启一下终端)

用go搭建web服务

在这里咱们用的是Gorilla/mux包。步骤:

  1. 创建NewRouter
  2. 设置端口号
  3. 设置http的参数字典
  4. 调用ListenAndServe方法,启动服务

go语言基础

  1. 导包:多个包用小括号括起来 a. import ( "sync" "time" )
  2. 使用点调用方法: a. time.Now()
  3. 声明变量: a. var coin int 用空格隔开,类型写到后面,变量名写中间,最前面是个var b. coin := 10 也可以省略var,用:=来赋值,但是必须保证coin没有声明过,否则会报错 c. coin1,coin2 := 10,20 多变量声明是这样的
  4. 条件控制: a. if a<b { return 10 }else{ return 20 }
  5. 循环控制: a. for a := 0; a < 10; a++ {
    fmt.Printf("a: %d\n", a) }
  6. 函数定义,传参: a. /* 函数返回两个数的最大值 */ b. func max(num1, num2 int) int { } c. num1, num2 int表示两个整形参数,是可选的,也可以不填, d. 最后的int是返回值的类型 e. 调用函数通过这样方式:n := max(a, b)
  7. 结构体定义,赋值,调用: 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学习

整理思路:

根据之前了解的区块链原理,我们整理一下需要实现哪些方法:

  1. 一个区块需要包含哪些信息: a. Index :这个区块在整个链中的索引 b. Timestamp : 区块生成时的时间戳 c. Hash : 区块通过 SHA256 算法生成的哈希值 d. PrevHash : 前一个区块的 SHA256 哈希值 e. content : 需要记录的内容
  2. 计算哈希值的函数
  3. 生成新区块的函数
  4. 根据不可篡改性,我们还需要一个验证区块是否被篡改的函数
  5. 启动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

开发自己的区块链基础功能篇相关推荐

  1. 【区块链开发指南】区块链基础之区块和交易

    在区块链网络当中,所有的数据都以区块的形式记录在各个节点上.而每个区块又以单独的文件保存在节点本地磁盘上,在比特币(Linux系统)中所有的区块信息都保存在~/.bitcoin/blocks/目录下面 ...

  2. java玩转区块链-基础篇-账户

    java玩转区块链-基础篇--账户 java环境配置 基础概念 账户 maven包引用 创建账户代码 代码解释 (1) (2) (3) (4) 可以不让搞,但是不允许你不会 java环境配置 jdk版 ...

  3. java玩转区块链-基础篇-solidity语法-基础类型

    java玩转区块链-基础篇-solidity语法-基础类型 java环境配置 代码准备 maven 完整solidity 执行步骤 基础类型 布尔类型 类型标识: 字面常量值: 运算符: 短路规则: ...

  4. 【链块技术10期】区块链基础语言(二)——GO语言开发环境搭建

    ‍原文链接:区块链基础语言(二)--Go语言开发环境搭建 一.操作系统位数的查询方法‍ 在安装前首先要了解个人的电脑系统位数是32位还是64位. 1.1Windows系统查询方法 右击"计算 ...

  5. 《区块链开发指南》一一第1章 区块链基础

    第1章 区块链基础 区块链究竟是什么?狭义地说,区块链就是比特币的底层技术:不过,经过7年的发展,区块链已经不再"依附于"比特币,而是独立地发展成为了一种革命性的技术,比特币则是区 ...

  6. 面向 Java 开发人员的区块链链代码

    面向 Java 开发人员的链代码简介 点击查看视频演示查看抄本 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger F ...

  7. 5分钟学会区块链 - 开发一条区块链 Develop BlockChain with Tendermint

    本文攻略:解惑区块链开发,学习 Tendermint,给自己造一条区块链 建议玩家等级:技术小白,学生党,初级码农 阅读此文先解锁技能: 一点点命令行基础 一点点 GO 基础:三天包学会 一点点区块链 ...

  8. 区块链基础学习(一)

    一.区块链简介 1.1.区块链与区块链技术 区块链是将记录(区块)通过密码学串联并加密的链式数据结构.而区块链技术,是通过P2P网络和区块链来实现数据存储的去中心化.不可逆和不可篡改.比特币正是构建在 ...

  9. java 区块链开发_Java开发人员的区块链入门

    java 区块链开发 顶级技术专家将区块链列为十大新兴技术之一,它们有潜力在未来十年内改变我们的世界,这值得您花时间学习. 如果您是一名具有Java背景的开发人员,并且想快速了解区块链技术,那么本文将 ...

最新文章

  1. 安装npm出现Profile not found.的问题
  2. Markdown 语法简介
  3. 一站式Web开发套件BeetleX.WebFamily
  4. mysql数据库mha_MySQL高可用性大杀器之MHA
  5. vi/vim文本编辑器的使用
  6. springBoot+springSecurity 数据库动态管理用户、角色、权限
  7. Android中Parcelable和Serializable接口用法
  8. nginx php访问阻塞,php-cgi和php-fpm,Windows环境下解决Nginx+php并发访问阻塞问题。
  9. 计算机会计u8实验报告,会计信息系统实验报告 用友u8
  10. PMP-项目进度管理
  11. 三自由度机器人轨迹规划(两旋转+移动)
  12. 2022鹏业安装算量软件10大常见问题整理
  13. 采购入库单扫码校验,收货校验发现供应商送货错误。思迅安卓盘点机PDA
  14. 浅谈人工智能的伦理问题
  15. spool off参数详解
  16. HQL 报 return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask 错误解决方案
  17. ElasticSearch 命令
  18. Ubuntu20.04换为清华的镜像源
  19. C-获得文件大小并动态申请内存屏幕打印文件内容小程序
  20. fiddler和wireshark

热门文章

  1. JVM-12虚拟机性能监控与故障处理工具之【JDK的可视化工具-VisualVM】
  2. bug ava.sql.SQLException: No more data to read from socket
  3. 找不到jar包的解决方法
  4. nav 计算机网络_CTO下载-计算机网络课件(配套韩立刚老师课程).ppt
  5. 2021-01-10 Halcon初学者知识 【10】形状匹配 【二】模板的形状匹配
  6. mysql如果索引为uid间隙锁_mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)...
  7. python是目前计算机语言的主流吗_即便C++现在是增长最快的语言,为什么它不及Java、Python流行?...
  8. 22个超详细的 JS 数组方法
  9. 2021-03-12 Python基础核心概念 变量和简单数据类型
  10. linux 统计根目录下的文件日期和出现的频率