区块链GO源码(内有区块、区块链、交易等代码)

  • Q1_548832
    了解作者
  • 2.7MB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-05-27 03:16
    上传日期
区块中含有区块链相关内容,包括区块、区块链、UTXO、交易等内容。简单看得懂,window下运行即可。绝对值
V4.rar
  • V4
  • bin
  • go_build_Project_src__2_.exe
    3.4MB
  • go_build_Project_src__1_.exe
    4B
  • go_build_Project_src.exe
    2.2MB
  • v2.exe
    4B
  • pkg
  • src
  • block.go
    1.8KB
  • main.go
    214B
  • transaction.go
    2.7KB
  • commands.go
    1.4KB
  • utils.go
    416B
  • blockChain.db
    64KB
  • proofOfWork.go
    1.4KB
  • commandLine.go
    2.7KB
  • blockChain.go
    6KB
  • .idea
  • workspace.xml
    11.6KB
  • Project.iml
    330B
  • dictionaries
  • Administrator.xml
    237B
  • misc.xml
    179B
  • modules.xml
    273B
  • codeStyles
  • codeStyleConfig.xml
    153B
内容介绍
package main import ( bolt "boltdb" "fmt" "os" ) const dbFile = "blockChain.db" const blockBucket = "bucket" const lastHashKey = "key" const genesisInfo = "YuanShuai will be a happy boy" type BlockChain struct { //blocks []*Block db *bolt.DB //数据库操作句柄 tail []byte // 最后一个区块哈希值 } //校验文件是否存在 func isDBExit() bool { _, err := os.Stat(dbFile) if os.IsNotExist(err) { return false } return true } //创建blockChain数据库文件 func InitBlockChain(address string) *BlockChain { if isDBExit() { fmt.Println(" blockChain db exit already,shouldn't created") os.Exit(1) } db, err := bolt.Open(dbFile, 0600, nil) //打开bolt数据库 CheckErr("InitBlockChain", err) // (db *DB) Update(fn func(*Tx) error) error { var lastHash []byte db.Update(func(tx *bolt.Tx) error { //没有bucket ,要去创建创世区块,将数据填写到数据库的bucket中 coinbase := NewCoinbaseTx(address, genesisInfo) genesis := NewGenesisBlock(coinbase) bucket, err := tx.CreateBucket([]byte(blockBucket)) CheckErr("InitBlockChain1", err) //写入数据库操作 bucket.Put(genesis.Hash, genesis.Serialize()) CheckErr("InitBlockChain2", err) bucket.Put([]byte(lastHashKey), genesis.Hash) CheckErr("InitBlockChain3", err) lastHash = genesis.Hash return nil }) return &BlockChain{db, lastHash} } func GetBlockChainHandler() *BlockChain { if !isDBExit() { fmt.Println("Pls create blockChain db") os.Exit(1) } db, err := bolt.Open(dbFile, 0600, nil) //打开bolt数据库 CheckErr("NewBlockChain1", err) var lastHash []byte db.View(func(tx *bolt.Tx) error { bucket := tx.Bucket([]byte(blockBucket)) if bucket != nil { //取出最后区块的哈希值 lastHash = bucket.Get([]byte(lastHashKey)) } return nil }) return &BlockChain{db, lastHash} } func (bc *BlockChain) AddBlock(txs []*Transaction) { //preBlockHash := bc.blocks[len(bc.blocks)-1].Hash //block := NewBlock(data ,preBlockHash) //bc.blocks =append(bc.blocks,block) var prevBlockHash []byte bc.db.View(func(tx *bolt.Tx) error { bucket := tx.Bucket([]byte(blockBucket)) if bucket == nil { os.Exit(1) } prevBlockHash = bucket.Get([]byte(lastHashKey)) return nil }) block := NewBlock(txs, prevBlockHash) err := bc.db.Update(func(tx *bolt.Tx) error { bucket := tx.Bucket([]byte(blockBucket)) if bucket == nil { os.Exit(1) } err := bucket.Put(block.Hash, block.Serialize()) CheckErr("AddBlock1", err) err = bucket.Put([]byte(lastHashKey), block.Hash) CheckErr("AddBlock2", err) bc.tail = block.Hash return nil }) CheckErr("AddBlock3", err) } //迭代器编写,里面包含了一个游标,一直往前移动,完成整个容器的遍历 type BlockChainIterator struct { currHash []byte db *bolt.DB } //创建迭代器,初始化指向最后一个区块 func (bc *BlockChain) NewIterator() *BlockChainIterator { return &BlockChainIterator{currHash: bc.tail, db: bc.db} } func (it *BlockChainIterator) Next() (block *Block) { err := it.db.View(func(tx *bolt.Tx) error { bucket := tx.Bucket([]byte(blockBucket)) if bucket == nil { return nil } data := bucket.Get(it.currHash) block = Deserialize(data) it.currHash = block.PrevBlockHash return nil }) CheckErr("Next()", err) return } //返回指定地址能否支配的UTXO的交易集合 func (bc *BlockChain) FindUTXOTransactions(address string) []Transaction{ var UTXOTransactions []Transaction //包含目标utxo的交易集合 //存储使用过的utxo的集合 map[交易id] []int64(0x1111111:0,1,都是给Alice转账) spentUTXO := make(map[string][]int64) it := bc.NewIterator() for { block := it.Next() //遍历区块 for _, tx := range block.Transactions { //遍历交易 //遍历input,找到已经消耗的utxo,把他们放到一个集合中 //需要两个子弹来标识使用的utxo, 交易ID 和 output 的索引 if !tx.IsCoinbase() { for _, input := range tx.TXInputs { if input.CanUnlockUTXOWith(address) { //map[txid][]int64 spentUTXO[string(input.TXID)] = append(spentUTXO[string(input.TXID)], input.Vout) } } } OUTPUTS: for currIndex, output := range tx.TXOutputs { //遍历output,找到所有可以支配的utxo //检查当前的output是否已经被消耗,如果消耗,那么进行下一个output的校验 if spentUTXO[string(tx.TXID)] != nil { //非空,代表当前交易里有消耗的utxo indexes := spentUTXO[string(tx.TXID)] for _, index := range indexes { //当前的索引和消耗的索引比较,相同,表明这个output肯定被消耗了,直接跳过,进行下一个output判断 if int64(currIndex) == index { continue OUTPUTS } } } if output.CanBeUnlockedWith(address) { //如果当前地址是这个utxo的所有者,满足条件 UTXOTransactions = append(UTXOTransactions, *tx) } } } if len(block.PrevBlockHash) == 0 { break } } return UTXOTransactions } func (bc *BlockChain)FindUTXO(address string) []TXOutput{ var UTXOs []TXOutput txs := bc.FindUTXOTransactions(address) for _,tx := range txs{ //遍历交易 for _,utxo :=range tx.TXOutputs{ // 遍历output if utxo.CanBeUnlockedWith(address){ UTXOs = append(UTXOs ,utxo) } } } return UTXOs } //validUTXOs,total = bc.FindSuitableUTXOs(from , amount) func (bc *BlockChain)FindSuitableUTXOs(address string , amount float64)(map[string][]int64,float64){ txs := bc.FindUTXOTransactions(address) validUTXOs :=make(map[string][]int64) //遍历交易 var total float64 FIND: for _,tx :=range txs{ outputs := tx.TXOutputs //遍历outputs (utxo) for index,output := range outputs{ if output.CanBeUnlockedWith(address){ if total <amount{ //判断当前收集的utxo的总金额是否大于需要花费的金额 total +=output.Value validUTXOs[string(tx.TXID)] = append(validUTXOs[string(tx.TXID)],int64(index)) }else { break FIND } } } } return validUTXOs,total }
评论
    相关推荐
    • 区块链
      区块链Python 专案 课堂项目的第1部分 基本设置和工作证明(basic_block_gp) 第1部分带回家的项目 客户端矿工(client_mining_p) 课堂项目的第二部分 基本交易(basic_transactions_gp) 第2部分带回家的项目 ...
    • 私人区块链
      私人区块链应用 您以区块链开发人员的身份开始旅程,此项目可让您证明您已熟悉区块链平台的基本概念。 像这样的概念:-区块-区块链-钱包-区块链身份-存在证明 您是否需要描述区块链框架中一些最重要的组件,为什么不...
    • 区块链
      区块链 运行权限证明区块链 权限证明(PoA)算法通常用于私有区块链网络,因为它需要预先批准或投票批准可以批准交易(封签)的账户地址。 由于必须批准帐户,因此我们将生成两个具有新帐户地址的新节点,这些地址将...
    • 区块链
      区块链
    • 区块链白皮书
      区块链白皮书合集,内容比较全,2018新版。区块链白皮书合集,内容比较全,2018新版。
    • 区块链
      区块链
    • 区块链
      区块链
    • 区块链技术
      .希望进行区块链开发的程序员。 ·希望投资或参与区块链项目的人员。 ·对区块链感兴趣的爱好者
    • 区块链
      blochchain_prot 该项目基于hyperledger fabric 2.1版本,有关详细说明,请访问 。 您也可以在该手册。
    • 区块链
      区块链Python 专案 课堂项目的第1部分 基本设置和工作证明(basic_block_gp) 第1部分带回家的项目 客户端矿工(client_mining_p) 课堂项目的第二部分 基本交易(basic_transactions_gp) 第2部分带回家的项目 ...