基于指针数组实现简单的区块链day(代码片段)

初心魏 初心魏     2023-01-06     443

关键词:

一、比特币的基础知识

1.1 比特币

一个软件系统,每个人都可以下载使用,使用者之间不断进行交易,产生数据

1.2 区块

比特币系统使用者之间交易的数据以数据块的形式存储,最终存储在数据库中,这个包含交易数据的数据块我们称之为区块。

1.3 区块链

保存上述所有区块的数据库我们称之为区块链。

1.4 记账

将系统中的交易数据写到数据库中我们称之为记账

1. 5 钱包

  • 创建私钥公钥,保存公钥,相当于钱包,可以存放多个地址
  • 地址类似银行卡,私钥类似银行卡密码
  • 钱包会便利账本的交易信息,来得知有没有钱
  • 一个地址对应一个私钥

1.6 节点

每一个运行区块链挖矿软件的人都会便成为一个区块链网络的节点。

1.7 挖矿

节点之间竞争记账的权利就称之为挖矿。

1.8出块时间

大约10分钟出一个比特币

1.9 出块奖励

1.10 比特币总量

1.11 区块容量

1M大约容纳4000笔交易

1.12 每秒成交量

1.13 单位

sat(聪)

二、其他基础知识

2.1 挖矿(工作量证明)

sha256(区块数据+随机数据)<目标的哈希值

2.2 go演示挖矿

import (
	"crypto/sha256"
	"fmt"
)

func main()
	data := "helloWord"
	for i:=0; i < 100; i++
		res := sha256.Sum256([]byte(data + string(i)))
		fmt.Printf("%x", res[:])
		fmt.Println()
	

2.3 地址生成规则

私钥经过椭圆曲线相乘生成公钥,在通过哈希算法得到比特币地址。

2.4 base64

0-9,a-z,A-Z,+,-

2.5 交易

  • 挖矿交易
  • 普通交易

三、模拟简单的区块链

3.1 创建简单的区块


type Block struct
	PreBlockHash []byte
	Hash []byte
	Data []byte

//创建block
func createBlock(preBlockHash []byte, data string) *Block
	block := Block
		PreBlockHash: preBlockHash,
		Data: []byte(data),
		Hash: []byte,
	
	block.SetHash()
	return &block


// SetHash 计算当前区块的hash
func (block *Block)SetHash()
	//...的作用是把data数组打散,一个个装进preBlockHash切片中
     blockInfo := append(block.PreBlockHash,block.Data...)
	 //hash是一个字节数组
	 Hash := sha256.Sum256(blockInfo)
	 //block.Hash作为Hash的切片
	 block.Hash = Hash[:]

func main() 
	//创建一个区块
	var block *Block = createBlock([]byte, "第一个区块")
	fmt.Printf("上一区块的hash值%x:",block.PreBlockHash)
	fmt.Println()
	fmt.Printf("当前区块的hash值%x:",block.Hash)
	fmt.Println()
	fmt.Println("当前区块的数据",string(block.Data))



结果:
前面区块的hash值 []
当前区块的hash值328fffe02f9e57c15508352cb145aa68abcf83da69a059e975d2171b1e7f8f92
当前区块的数据 第一个区块

3.2 创建简单的区块链

  • 本质上是用一个区块指针类型的数组构成的区块链
// BlockChain 区块链结构体
//本质上是区块指针类型的数组
type BlockChain struct 
	blockChain []*Block

// CreateBlockChain 创建带有一个创世块的区块链
func CreateBlockChain() *BlockChain
	blockChain := BlockChain
		blockChain: []*BlockGenesisBlock(),
	
	return &blockChain

3.3 创建创世块

// GenesisBlock 创建创世块,即第一个区块
func GenesisBlock() *Block
	genesisBlock := CreateBlock([]byte,"第一个创世块,牛逼")
	return genesisBlock

3.4 向区块链中添加区块

// AddBlock 当前区块的前一区块哈希值字段从区块链中获取
func (bc *BlockChain)AddBlock(data string)
	preHash := bc.blockChain[len(bc.blockChain)-1].Hash
	block := CreateBlock(preHash, data)
	bc.blockChain = append(bc.blockChain, block)

四、模拟复杂的区块链

4.1 将unit64转换成byte类型

// Uint64ConvertByte 将uint64类型转换为[]byte类型
func Uint64ConvertByte(data uint64)[]byte
	var buffer bytes.Buffer
	err := binary.Write(&buffer, binary.BigEndian,data)
	if err != nil 
		log.Panicln(err)
	
	return buffer.Bytes()

4.2 bytes.Join()

  • 将二维byte数组连接成一个一维byte数组
func (block *Block)SetHash()
	var blockInfo []byte
	//...的作用是把data数组打散,一个个装进preBlockHash切片中
	//blockInfo = append(blockInfo, Uint64ConvertByte(block.Version)...)
	//blockInfo = append(blockInfo, block.PreBlockHash...)
	//blockInfo = append(blockInfo, block.MerkelRoot...)
	//blockInfo = append(blockInfo, Uint64ConvertByte(block.TimeStamp)...)
	//blockInfo = append(blockInfo, Uint64ConvertByte(block.Difficulty)...)
	//blockInfo = append(blockInfo, Uint64ConvertByte(block.Nonce)...)
	//blockInfo = append(blockInfo, block.Data...)
	// 创建一个二维数组
	tem := [][]byte
		Uint64ConvertByte(block.Version),
		block.PreBlockHash,
		block.MerkelRoot,
		Uint64ConvertByte(block.TimeStamp),
		Uint64ConvertByte(block.Difficulty),
		Uint64ConvertByte(block.Nonce),
		block.Data,
	
	//将二维byte数组连接成一维byte数组
	bytes.Join(tem, []byte)
	//hash是一个字节数组
	Hash := sha256.Sum256(blockInfo)
	//block.Hash作为Hash的切片
	block.Hash = Hash[:]

4.3 挖矿演示

type ProofOfWork struct 
	block *Block
	target *big.Int

//CreatePOW 创建ProofOfWork
func CreatePOW(block *Block) *ProofOfWork
	pow := ProofOfWork
		block: block,
	
	target :=  "0000100000000000000000000000000000000000000000000000000000000000"
	bigNum := big.Int
	//res是指针类型的
	res, _ := bigNum.SetString(target, 16)
	pow.target = res
    return &pow

//Run 返回一个Hash值和随机数
func (pow *ProofOfWork) Run()([]byte, uint64)
	tmpBigInt := &big.Int
	//与给定的目标哈希值进行比较,小于则挖矿成功
	var nonce uint64 = 0
	var hash [32]byte
	for
		block := pow.block
		tem := [][]byte
			Uint64ConvertByte(block.Version),
			block.PreBlockHash,
			block.MerkelRoot,
			Uint64ConvertByte(block.TimeStamp),
			Uint64ConvertByte(block.Difficulty),
			Uint64ConvertByte(nonce),
			block.Data,
		
		// blockInfo 拼装好的数据
		blockInfo := bytes.Join(tem, []byte(""))
		hash = sha256.Sum256(blockInfo)
		tmpBigInt.SetBytes(hash[:])
		res := tmpBigInt.Cmp(pow.target)
		if res == -1
			break
		
		nonce ++
	
   return hash[:],nonce

五、git命令

5.1 git pull

将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。

git pull origin master:brantest

5.2 git push

git push 命用于从将本地的分支版本上传到远程并合并。

命令格式如下:

git push <远程主机名> <本地分支名>:<远程分支名>

如果本地分支名与远程分支名相同,则可以省略冒号:

git push <远程主机名> <本地分支名>

5.3 git push --set-upstream origin v2

  • 设置本地分支追踪远程分支

毕业设计之---基于联盟连的区块链实现(代码片段)

...向同学们介绍区块链相关知识,以及如何使用Java实现一个基于联盟链的区块链系统,你甚至可以发布属于自己的虚拟货币.阅读该文章你讲搞懂:什么是区块链区块链有哪些分类区块链实现的关键技术区块链的简单实现区块链及类型... 查看详情

区块链的简单实现(代码片段)

区块链的简单实现什么是区块链块结构创世区块hash验证块的有效性记录数据从其他节点接收一个块编写测试代码测试结果完整代码什么是区块链一个维护着一个持续增长的有序数据记录列表的这么一个分布式数据库下面我将简... 查看详情

区块链简单实现之p2p网络多节点同步(代码片段)

...现了一个简单的区块链数据结构。现状:区块存放在数组中,程序重启就是一条新链,并且也只有单节点 查看详情

基于java实现的简单区块链

技术:maven3.0.5+jdk1.8 概述区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。详细代码下载:http://www... 查看详情

:最小可行区块链(代码片段)

...据记录列表的这么一个分布式数据库。在此章节中我们将实现一个简单的玩具版的区块链。此章节结束时,我们的区块链将实现以下功能:实现区块和区块链结构定义实现可以将包含任意数据的新区块写入到区块链的方法实现可... 查看详情

区块链的简单实现(代码片段)

区块链的简单实现什么是区块链块结构创世区块hash验证块的有效性记录数据从其他节点接收一个块编写测试代码测试结果完整代码什么是区块链一个维护着一个持续增长的有序数据记录列表的这么一个分布式数据库下面我将简... 查看详情

区块链简单实现之p2p网络多节点同步(代码片段)

...现了一个简单的区块链数据结构。现状:区块存放在数组中,程序重启就是一条新链,并且也只有单节点,没有引入多节点。目标:将区块保存为文件,实现多节点之间的同步。将区块保存为json文件之前... 查看详情

使用javascript实现简单的区块链(签名+工作量证明机制)(代码片段)

//区块链blockchain//data之前区块的哈希值当前区块的哈希值:是由存储在区块里的信息算出来的(data+之前区块的哈希值)constsha256=require('./crypto-js/sha256')//区块classBlockconstructor(data)this.data=datathi 查看详情

基于共识算法和区块链模拟实现超级账本(代码片段)

基于共识算法和区块链模拟实现超级账本实验语言:GO实验环境:GoLand2022.1;go1.13.4.widows-amd64.msi;curl-7.83.1实验中使用的开源包:http://github.com/davecgh/go-spew/spew;http://github.com/gorilla/mux;http://github.com/joho... 查看详情

学习用python实现简单区块链(代码片段)

Python实现区块链环境python3(本次用的3.8)、postman、requests、Flask,pip,pipenv等工具环境步骤先安装一个环境pipinstallpipenvpipenv使用创建环境pipenvinstall会生成一个pipfile文件,用于管理库的依赖在虚拟环境中安装依赖pipenvinst... 查看详情

rust实现简单区块链(代码片段)

85行Rust实现一个简单的区块链概述这篇文章只是把之前写的C语言区块链用Rust实现了下,并且使用了md5作为哈希函数。本文只是为了Rust练手,不得不说这语言学起来难但是用起来真爽哈哈哈区块链=由区块顺次连接形成... 查看详情

记录我在区块链互联网公司的实习生活day9(代码片段)

...又来啦,果然还是双休让人提神醒脑😜任务清单基于昨天的思考,我在今天做了部分尝试尝试用我的电脑去监控另一台服务器尝试在自己的电脑上部署区块链节点并监控任务记录任务一:尝试用我的电脑去监控另... 查看详情

hyperledgerfabric2.xjava区块链应用(代码片段)

...装并使用cli客户端进行合约的调用;本文将使用Java代码基于fabric-gateway-java进行区块链网络的访问与交易,并集成SpringBoot框架。FabricGatewaySDK实现Fabric的编程模型,提供了一系列简单的API给应用程序与Fabric区块链网络进行交互;... 查看详情

区块链记账原理(代码片段)

区块链(1.0)是一个基于密码学安全的分布式账本,是一个方便验证,不可篡改的账本。通常认为与智能合约相结合的区块链为区块链2.0,如以太坊是典型的区块链2.0很多人只了解过比特币,不知道区块链,比特币实际是一个使用了... 查看详情

区块链记账原理(代码片段)

区块链(1.0)是一个基于密码学安全的分布式账本,是一个方便验证,不可篡改的账本。通常认为与智能合约相结合的区块链为区块链2.0,如以太坊是典型的区块链2.0很多人只了解过比特币,不知道区块链,比特币实际是一个使用了... 查看详情

zt-----用javascrip写一个区块链(代码片段)

...作的。我将会称之为SavjeeCoin!全文分为三个部分: 实现一个基本的区块链实现POW交易与挖矿奖励 实现一个基本的区块链区块链区块链是由一个个任何人都可以访问的区块构成的公共数据库。这好像没 查看详情

区块链技术go语言——数组篇(代码片段)

/**@Author:mrtao*@Date:2018-08-1414:48:25*@LastModifiedby:mrtao*@LastModifiedtime:2018-08-1415:55:51*/packagemainimport"fmt"funcmain() //指针 varp*int a:=10 p=&a //p& 查看详情

深度探索区块链/基于数字证书的成员管理服务(代码片段)

基于数字证书的成员管理服务hyperledgerFabric1.0基于PKI体系,生成数字证书以标识用户的身份。每个身份和成员管理服务提供商(MembershipServiceProvider,MSP)的编号进行关联。一。实现成员管理的MSPMSP(MembershipServiceProvider):成员... 查看详情