首页 > 编程语言 >区块链编程go(四)-交易

区块链编程go(四)-交易

时间:2024-08-17 12:48:43浏览次数:7  
标签:Transaction tx outputs 编程 TxOutput TxInput go 区块 data

 

part1:

package blockchain

import (
    "bytes"
    "crypto/sha256"
    "encoding/gob"
    "encoding/hex"
    "fmt"
    "log"
)

type Transaction struct {
    ID      []byte
    Inputs  []TxInput
    Outputs []TxOutput
}

type TxOutput struct {
    Value  int
    PubKey string
}

type TxInput struct {
    ID  []byte
    Out int
    Sig string
}

func (tx *Transaction) SetID() {
    var encoded bytes.Buffer
    var hash [32]byte

    encode := gob.NewEncoder(&encoded)
    err := encode.Encode(tx)
    Handle(err)

    hash = sha256.Sum256(encoded.Bytes())
    tx.ID = hash[:]
}

func CoinbaseTx(to, data string) *Transaction {
    if data == "" {
        data = fmt.Sprintf("Coins to %s", to)
    }

    txin := TxInput{[]byte{}, -1, data}
    txout := TxOutput{100, to}

    tx := Transaction{nil, []TxInput{txin}, []TxOutput{txout}}
    tx.SetID()

    return &tx
}

func NewTransaction(from, to string, amount int, chain *BlockChain) *Transaction {
    var inputs []TxInput
    var outputs []TxOutput

    acc, validOutputs := chain.FindSpendableOutputs(from, amount)

    if acc < amount {
        log.Panic("Error: not enough funds")
    }

    for txid, outs := range validOutputs {
        txID, err := hex.DecodeString(txid)
        Handle(err)

        for _, out := range outs {
            input := TxInput{txID, out, from}
            inputs = append(inputs, input)
        }
    }

    outputs = append(outputs, TxOutput{amount, to})

    if acc > amount {
        outputs = append(outputs, TxOutput{acc - amount, from})
    }

    tx := Transaction{nil, inputs, outputs}
    tx.SetID()

    return &tx
}

func (tx *Transaction) IsCoinbase() bool {
    return len(tx.Inputs) == 1 && len(tx.Inputs[0].ID) == 0 && tx.Inputs[0].Out == -1
}

func (in *TxInput) CanUnlock(data string) bool {
    return in.Sig == data
}

func (out *TxOutput) CanBeUnlocked(data string) bool {
    return out.PubKey == data
}

 

标签:Transaction,tx,outputs,编程,TxOutput,TxInput,go,区块,data
From: https://www.cnblogs.com/apenote/p/18364235

相关文章

  • go金融系统开发中的关键知识点:确保稳定、安全和高效
    在现代金融系统的开发过程中,涉及的数据处理和业务逻辑异常复杂,要求开发者不仅需要掌握基础的编程技术,还需要理解和应用一些高级的技术和策略。本文将探讨在金融系统开发中需要关注的关键知识点,包括事务管理、流水记录、数据一致性、安全性等方面,帮助你构建稳定、安全且高效的金融......
  • 【MongoDB】MongoDB 开启auth认证
    一、MongoDB安装参考:【MongoDB】MongoDB安装-H__D-博客园(cnblogs.com)二、开启auth认证1、事由由于自己服务器上的mongodb未开启认证,导致黑客盯上天,我的MongoDB数据被黑客删库了,还勒索要支付比特币赎回。。。现象:数据库被删,发现多了个库README_TO_RECO......
  • 信息学奥赛一本通编程启蒙题解(3011~3015)
    前言Hello大家好,我是文宇.正文3011#include<iostream>usingnamespacestd;intmain(){ inta,b,s; a=880; b=500; s=a*b; cout<<s; return0;}注:没有输入的都可以直接输出.3012#include<iostream>usingnamespacestd;inta,b,t;intmain(){ a=10;b=20......
  • 信息学奥赛一本通编程启蒙题解(3021~3025)
    前言hello大家好,我是文宇。正文3021#include<iostream>usingnamespacestd;inta,b,c,d;intmain(){ cin>>a>>b>>c>>d; cout<<a+b+c+d; return0;}3022#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta,b,c; ......
  • 【嵌入式开发之网络编程】互联网的基本概念
    计算机网络的定义计算机网络的精确定义并未统一:以功能完善的网络软件及通信协议实现资源共享和信息传递的系统。以传输信息为基本目的,用通信线路和通信设备将多个计算机连接起来的计算机系统的集合。计算机网络的分类 按照网络的作用范围进行分类类别作用范围或距离广域......
  • 爆改YOLOv8 || 利用Gold-YOLO提高YOLOv8对小目标检测精度
    1,本文介绍Gold-YOLO通过一种创新的 聚合-分发(Gather-and-Distribute,GD)机制 来提高信息融合效率。这一机制利用卷积和自注意力操作来处理来自网络不同层的信息。通过这种方式,Gold-YOLO能够更有效地融合多尺度特征,实现低延迟和高准确性之间的理想平衡.关于GOLD-YOLO的详细......
  • Golang使用Option设计模式优雅处理可选参数
    go语言不像其他语言函数的参数可以设置默认值以下是参考第三方库的写法packagemainimport"fmt"typeUserstruct{namestringageintidint}//Option代表可选参数typeOptionfunc(foo*User)//WithName为name字段提供一个设置器funcWithName(name......
  • Google Earth Engine(GEE)——1986-2021年黄河入海口区域的逐年影像展示案例分析,并加载
    函数:size()Returnsthenumberofelementsinthecollection.返回集合中元素的数量。Arguments:this:collection(FeatureCollection):Thecollectiontocount.Returns:Integer融合影像可以一个接一个进行融合merge(collection2)Mergestwoimagecollectionsi......
  • 打造编程学习的高效笔记系统
    在编程学习的道路上,笔记不仅仅是知识的简单记录,更是我们理解、吸收和应用知识的重要工具。一个高效的笔记系统能够帮助我们更好地组织思路、加深记忆,并在需要时迅速找到所需的信息。那么,如何才能打造这样一个既实用又高效的编程学习笔记系统呢?目录一、笔记工具选择二、笔......
  • Linux:Go应用实践目录权限
    在Linux系统中,文件和目录的权限管理是日常系统维护的重要组成部分。权限设置不当可能导致安全漏洞,而合理配置则是保障系统安全的基石。本文将深入探讨Linux目录权限的管理,并展示如何使用Go语言来自动化这一过程,特别是针对需要批量修改权限的场景。Linux权限概念简介在Linu......