首页 > 其他分享 >区块链生态及技术栈

区块链生态及技术栈

时间:2024-03-12 20:57:22浏览次数:17  
标签:chain 技术 生态 block 哈希 byte 区块 Block

0.学习目的

goland作为开发工具,用go语言进行区块链系统的模拟运行与开发。

1.区块以及区块链的实现

区块链中的区块通常有以下几个基本属性:

Data:本身存储的数据

Hash:根据本身DataPrevhash由算法计算的来的哈希值

Prevhash:上一个区块的哈希值

Timestamp:时间戳

其余数据有待补充,我们先根据这四个基本的属性来建立一个类Block作为构筑区块链的基础区块。

package block

import (
	"bytes"
    "crypto/sha256"
	"time"
)

type Block struct {
	Hash     []byte
	Data     []byte
	PrevHash []byte
	Timestamp int64
}

根据定义我们了解到,区块中最重要的数据是哈希值,需结合已有的数据来计算出来,我们可以将数据Data,前一个块的哈希值PrevHash,和当前块的时间戳Timestam,连接在一起来构建一个字节数组info

使用SHA-256哈希函数对info进行哈希计算,使用sha256.Sum256()函数将计算出的哈希值存储在hash变量中。这个哈希值是一个长度为32字节的字节数组。

最后将计算出的哈希值切片赋值给当前块的Hash字段,以便在后续使用。

func (b *Block) deriveHash() {
	info := bytes.Join([][]byte{b.Data, b.PrevHash, []byte(string(b.Timestamp))}, []byte{})
	hash := sha256.Sum256(info)
	b.Hash = hash[:]
}

接下来写一个方法并调用derivehash()方法以创建区块。

func CreateBlock(data string, prevHash []byte) *Block {
	block := &Block{[]byte{}, []byte(data),prevHash ,time.Now().Unix()}
	block.deriveHash()
	return block
}

区块链就是一个集合了众多区块的结构体,构筑区块链就是在每个区块的第一个区块("创世区块")后面不断添加新的区块,我们先用上述的方法构建创世区块Genesis

func Genesis() *Block {
	return CreateBlock("Genesis", []byte{})
}

接下来定义结构体区块链并将创世区块作为第一个区块,等待添加的区块以构建区块链。

type BlockChain struct {
	Blocks []*Block
}

func InitBlockChain() *BlockChain {
	return &BlockChain{[]*Block{Genesis()}}
}

现在需要一个方法帮助我们在创世区块后面添加新块,根据我们对于区块的定义,我们对该方法有这样的要求:它接收一个data参数,该参数是要存储在新区块中的数据。首先获取区块链中的最后一个区块(即当前链的最新区块)作为prevBlock。然后,使用CreateBlock()函数创建一个新的区块,该区块的数据为传入的data,前一个区块的哈希值为prevBlock.Hash。最后,将新的区块追加到区块链的Blocks字段中,以实现向区块链添加新区块的功能。

func (chain *BlockChain) AddBlock(data string) {
	prevBlock := chain.Blocks[len(chain.Blocks)-1]
	new := CreateBlock(data, prevBlock.Hash)
	chain.Blocks = append(chain.Blocks, new)
}

至此我们有了进行一系列后续实验的基础,现在来检验一下成果。

package main

import (
	block "bcts"
	"fmt"
)

func blockchainRun() {
	chain := block.InitBlockChain()

	chain.AddBlock("First Block after Genesis")
	chain.AddBlock("Second Block after Genesis")
	chain.AddBlock("Third Block after Genesis")

	for _, block := range chain.Blocks {
		fmt.Printf("Previous Hash: %x\n", block.PrevHash)
		fmt.Printf("Data in Block: %s\n", block.Data)
		fmt.Printf("Hash: %x\n", block.Hash)
		fmt.Printf("time: %d\n",block.Timestamp)
	}
}
func main() {
	blockchainRun()
}

我们将会得到以下结果:

至此搭建了一个我们自己的区块链作为我们实验的工具。

标签:chain,技术,生态,block,哈希,byte,区块,Block
From: https://www.cnblogs.com/tianticheng/p/18069250

相关文章

  • Claude3、GPT-4 、Gemini、Sora:五大模型的技术特点与功能
    【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认......
  • 【SLAM】Soomthing And Mapping技术参考
    TectonicSAM笔记SAM(SmoothingAndMapping)是SLAM简化而提升效率的概念。SAM也是SFM(StructureFromMotion)的关键技术。TectonicSAM,采用因子图模型,优化方法估计状态(地图与位姿参数),本文将submap类比于大陆板块(Tectonic),对submap内部节点改变不明显,submap之间可大幅度调......
  • 今天来聊聊Hybird app技术
    最近听到身边的朋友经常聊到鸿蒙,也聊到开发周期紧、任务重,应对纯血鸿蒙2024年Q4的正式商用,不知道该如何开发更合适。 于是有感而发,在这里说一下个人现在比较看好的混合应用(hybirdapp)开发技术。 什么是混合应用开发?混合应用(通常指的是App开发)是一种结合了Web应用程序......
  • RC4Drop算法的工作原理揭秘:加密技术的进步之路
    RC4Drop算法起源:RC4Drop算法是RC4算法的一种改进版本,旨在解决RC4算法在长时间加密过程中可能出现的密钥流偏置问题。RC4算法由RonRivest于1987年设计,是一种流密码算法,而RC4Drop算法则在此基础上加入了丢弃密钥字节的步骤,以增强安全性和随机性。RC4Drop加密解密|一个覆盖......
  • 最新宽字节注入攻击和代码分析技术
    宽字节注入攻击宽字节注入攻击的测试地址在本书第2章。访问id=1',页面的返回结果如图4-51所示,程序并没有报错,反而多了一个转义符(反斜杠)。   图4-51  从返回的结果可以看出,参数id=1在数据库查询时是被单引号包围的。当传入id=1'时,传入的单引号又被转义符(反斜杠)转义,导......
  • BOSHIDA DC电源模块与稳压技术的结合优势
    BOSHIDADC电源模块与稳压技术的结合优势结合DC电源模块和稳压技术有以下优势: 1.稳定性:DC电源模块可以将交流电转换为直流电,并通过稳压技术保持输出电压稳定。这可以确保电子设备在不同负载和环境条件下都能获得稳定的电源供应,避免因电压波动而引起的设备故障或性能下降。2......
  • 深入解析:AntSK 0.1.7版本的技术革新与多模型管理策略
        在信息技术快速迭代的当下,.Net生态中的AntSK项目凭借其前沿的AI知识库和智能体技术,已经吸引了广大开发者的关注和参与。今天,我要给大家介绍的主角,AntSK0.1.7版本,无疑将是这个开源项目中的一次重大进步——多模型管理功能的引入,为使用者带来了更强大、更灵活的工具。......
  • Smb3.0多通道技术及故障排查
    Smb3.0多通道技术有RSS和RDMA网卡或两种网卡叠加实现微软是建议网卡带有RSS和RDMA,因为RDMA网卡很贵我没有条件测试。以下针对RSS-SMBRSS(receivesidescaling)功能中文名叫“接收端调整”,CPU多核心时,每核心(非超线程)可用一个线程发起一个通道。SMB多通道的要求由于默认情......
  • 技术笔记(7)Unity导入人物和场景,出现的材质问题
    技术笔记(7)Unity导入人物和场景,出现的材质问题一,如果两个人物拥有同名但内容不同的的材质shadererror:Unity在导入的时候,识别到近似内容时,会用新的内容去替换同名shader的内容,而不是重新创建一个。这样就会导致第一个人物的材质显示异常,其本质是shader内容被替换了。解决......
  • tsv文件在大数据技术栈里的应用场景
    是的,\t是指制表符(tab),它通常用作字段分隔符在TSV(Tab-SeparatedValues)格式的文件中。TSV是一种简单的文本格式,它使用制表符来分隔每一列中的值,而每一行则代表一个数据记录。TSV文件例:ID\tName\tAge\tCity1\tJohnDoe\t28\tNewYork2\tJaneSmith\t32\tLosAngeles上面的例......