随笔分类 - 区块链——比特币
根据观看相关视频的学习的总结
发表于 2021-04-17 10:12阅读:219评论:0推荐:0
摘要:项目相关介绍请查看https://github.com/MultiChain/multichain-web-demo,简单来说就是multichain节点的网页可视化。 第一步:安装Apache 1 # 安装Apache2 2 sudo apt-get install apache2 3 # 重启A
阅读全文 »
发表于 2020-12-24 19:50阅读:116评论:0推荐:0
摘要:部分代码(transaction.go文件中定义交易结构): 1 type TXInput struct { 2 TXID []byte //交易id 3 Index int64 //output的索引 4 Address string //解锁脚本,先使用地址来模拟 5 } 6 7 type TX
阅读全文 »
发表于 2020-12-10 22:56阅读:169评论:0推荐:0
摘要:传统转账: 传统银行的每个账户都会有一个数据库表来存储用户的信息,包括姓名,卡号,余额等基本信息,每产生一笔交易后,最终都会更新这个余额字段,这个数据表就是这个账户的存储结构。 转账成功与否只看这个字段的金额是否足够即可,不用把整个钱的来源检验一遍。 比特币转账: 比特币的数据库中只有交易,没有这个
阅读全文 »
发表于 2020-12-07 11:05阅读:75评论:0推荐:0
摘要:命令行demo代码: 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 ) 7 8 func main() { 9 //返回的是数组 10 cmds := os.Args 11 12 //通过字符比较,去选择执行相应的程序 13 for i, cmd := r
阅读全文 »
发表于 2020-12-07 11:01阅读:86评论:0推荐:0
摘要:迭代器分析: 作用:遍历容器,将数据逐个返回,防止一次性加载到内存,所以一点一点读取。 类比于for循环里面的range 区块链迭代器图示如下,最初指向最后一个区块,返回区块,指针前移,直至第一个区块。 部分代码(blockchain.go文件中定义和创建迭代器): 1 //定义一个区块链的迭代器,
阅读全文 »
发表于 2020-12-04 23:10阅读:109评论:0推荐:0
摘要:部分代码(blockchain.go文件中改写addblock函数): 1 //V3版本 2 func (bc *BlockChain) AddBlock(data string) { 3 bc.db.Update(func(tx *bolt.Tx) error { 4 //所有的操作都在这里 5
阅读全文 »
发表于 2020-12-04 23:09阅读:104评论:0推荐:0
摘要:部分代码(block.go文件中添加序列化与反序列化): 1 //序列化,将区块转换为字节流 2 func (block *Block) Serialize() []byte { 3 4 var buffer bytes.Buffer 5 6 //定义编码器 7 encoder := gob.New
阅读全文 »
发表于 2020-12-04 23:08阅读:54评论:0推荐:0
摘要:部分代码(gob.go文件中创建一个gob的demo实现序列化与反序列化的功能): 1 package main 2 3 import ( 4 "encoding/gob" 5 "bytes" 6 "log" 7 "fmt" 8 ) 9 10 //1. gob是go语言内置的编码包 11 //2.
阅读全文 »
发表于 2020-12-04 23:07阅读:124评论:0推荐:0
摘要:部分代码(改写blockchain.go文件,修改获取区块的方式): 1 package main 2 3 import ( 4 "beijing_go_term2/bolt" 5 "fmt" 6 "log" 7 ) 8 9 //V1,V2版本 10 ////创建区块链,使用Block数组模拟 11
阅读全文 »
发表于 2020-12-03 15:00阅读:160评论:0推荐:0
摘要:当前版本问题: 区块在内存中,每次执行完程序就释放,无法重用 创建区块不灵活,在main中写死,无法随意添加区块 V3版本思路: Bolt数据库介绍:轻量级、开源、go语言实现、key->value进行读取(map)[ ]byteè[ ]byte BlockChain结构重写 NewBlockCha
阅读全文 »
发表于 2020-12-02 22:38阅读:94评论:0推荐:0
摘要:部分代码(proofofwork.go文件中使用Bits推导难度值): 1 const Bits = 20 2 3 func NewProofOfWork(block *Block) *ProofOfWork { 4 pow := ProofOfWork{ 5 block: block, 6 } 7
阅读全文 »
发表于 2020-12-02 22:32阅读:85评论:0推荐:0
摘要:部分代码(proofofwork.go文件中IsValid函数实现): 1 func (pow *ProofOfWork) IsValid() bool { 2 //在校验的时候,block的数据是完整的,我们要做的是校验一下,Hash,block数据,和Nonce是否满足难度值要求 3 4 //获
阅读全文 »
发表于 2020-12-02 22:31阅读:132评论:0推荐:0
摘要:部分代码(proofofwork.go文件中Run函数实现): 1 //这是pow的运算函数,为了获取挖矿的随机数,同时返回区块的哈希值 2 func (pow *ProofOfWork) Run() ([]byte, uint64) { 3 //1. 获取block数据 4 //2. 拼接nonc
阅读全文 »
发表于 2020-12-02 22:26阅读:99评论:0推荐:0
摘要:V1版本问题: 随机数的难度值是随便写的 区块的哈希值是无规则的 V2版本思路: 1.POW(工作量证明) A. block B. 目标值 2.创建POW的函数 NewProofOfWork(参数) 3.不断计算hash的函数 Run() 4.一个校验函数 IsValid() 部分代码(proofo
阅读全文 »
发表于 2020-12-01 19:43阅读:83评论:0推荐:0
摘要:部分代码(Join函数优化): 1 //为了生成区块哈希,实现一个简单的函数,来计算哈希值,没有随机值,没有难度值 2 func (block *Block) SetHash() { 3 //var data []byte 4 ////类型是byte,而数据结构是uint64,所以构建一个工具类,将
阅读全文 »
发表于 2020-12-01 19:42阅读:134评论:0推荐:0
摘要:部分代码(补充区块字段): 1 //定义区块结构 2 type Block struct { 3 //区块版本号 4 Version uint64 5 //前区块哈希 6 PrevBlockHash [] byte 7 //先填写为空,后续v4的时候使用 8 MerKleRoot [] byte 9
阅读全文 »
发表于 2020-11-21 21:41阅读:157评论:0推荐:0
摘要:代码重构: block.go文件: package main import ( "crypto/sha256" ) //定义区块结构 type Block struct { //前区块哈希 PrevBlockHash [] byte //当前区块哈希 Hash [] byte //数据,目前使用字节
阅读全文 »
发表于 2020-11-21 21:39阅读:85评论:0推荐:0
摘要:部分程序代码(添加区块): //添加区块 func (bc *BlockChain) AddBlock(data string) { //创建一个区块 //bc.Block的最后一个区块的Hash值就是当前新区块的PrevBlockHash lastBlock := bc.Blocks[len(bc
阅读全文 »
发表于 2020-11-21 21:38阅读:145评论:0推荐:0
摘要:部分程序代码(区块链的定义及遍历打印): 1 //创建区块链,使用Block数组模拟 2 type BlockChain struct { 3 Blocks []*Block 4 } 5 6 //实现创建区块链的方法 7 func NewBlockChain() *BlockChain { 8 //
阅读全文 »
发表于 2020-11-21 21:37阅读:91评论:0推荐:0
摘要:部分程序代码(生成并调用hash代码): 1 //创建区块,对Block的每一个字段填充数据 2 func NewBlock(data string, prevBlockHash []byte) *Block{ 3 block := Block{ 4 PrevBlockHash: prevBlock
阅读全文 »