GO语言实现UTXO模型--如何定义交易

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

GO语言实现UTXO模型

对于比特币而言,一个人拥有的比特币余额就是看他所掌管的账户地址里包含多少个比特币,而计算这个比特币数量的方式或者说它的数据结构就叫做UTXO(Unspent Transaction Output),它体现里交易的原子性,即某个UTXO被引用就失效,更利于保证比特币不被双花攻击

如何定义交易

交易存在三要素:转出方、接收方、金额。比特币的交易数据大致包含三部分内容:元数据、输入项、输出项。 真实的比特币交易是相当复杂的,我们需要简化一下。

1、先定义一些结构体:

```go // 交易输入结构 type TXInput struct { Txid []byte //引用交易ID VoutIdx int //使用的交易输出编号 FromAddr string //输入方验签 }

// 交易输出结构 type TXOutput struct { Value int //输出金额 ToAddr string //收方验签 }

// 交易结构 type Transaction struct { ID []byte //交易ID Vin []TXInput //交易输入项 Vout []TXOutput //交易输出项 }

```

2、将交易结构序列化后计算hash值

```go // 交易结构 type Transaction struct { ID []byte //交易ID Vin []TXInput //交易输入项 Vout []TXOutput //交易输出项 }

// 将交易信息转换为hash,并设为ID func (tx *Transaction) SetID() { var encoded bytes.Buffer var hash [32]byte

enc := gob.NewEncoder(&encoded)
enc.Encode(tx)
hash = sha256.Sum256(encoded.Bytes())
tx.ID = hash[:]

} ```

3、需要在Block结构体中增加交易信息数据,为[]*Transaction类型

go // 定义区块结构 type Block struct { Timestamp int64 //时间戳 Transactions []*Transaction //交易信息 PrevBlockHash []byte //前块hash值 Hash []byte //当前块hash值 Nonce int64 //随机值 }

4、实现一种交易转[]byte的方法.

```go

//构建区块交易hash值 func (b *Block) HashTransactions() []byte { var txHashes [][]byte var txHash [32]byte

for _, tx := range b.Transactions {
    //字符串拼接ID
    txHashes = append(txHashes, tx.ID)
}
    //Join将txHashes的元素连接起来以创建一个新的字节片。分隔符[]byte{}放置在所得切片中的元素之间
txHash = sha256.Sum256(bytes.Join(txHashes, []byte{}))

return txHash[:]

} ```

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据区块链网络中心化程度的不同,分化出3种不同应用场景下的区块链:(1)全网公开,无用户授权机制的区块链,称为公有链;(2)允许授权的节点加入网络,可根据权限查看信息,往往被用于机构间的区块链,称为联盟链或行业链;(3)所有网络中的节点都掌握在一家机构手中,称为私有链。联盟链和私有链也统称为许可链,公有链称为非许可链。 公有区块链系统 公有链中,任何节点无须任何许可便可随时加入或脱离网络。从最早的比特币系统人手介绍公有链系统的发展现状。点对点电子现金系统:比特币与传统分布式系统的C/S , B/S或三层架构不同,比特币系统基于P2P网络,所有节点对等,且都运行同样的节点程序。节点程序总体上分为两部分:一部分是前台程序,包括钱包或图形化界面;另一部分是后台程序,包括挖矿、区块链管理、脚本引擎及网络管理等。区块链管理:涉及初始区块链下载、连接区块、断开区块、校验区块和保存区块,以及发现最长链条的顶区块。内存池管理:即交易池管理。节点将通过验证的交易放在一个交易池中,并准备好将其放入下一步挖到的区块中。邻接点管理:当一个新比特币节点初始启动时,它需要发现网络中的其他节点,并与至少一个节点连接。共识管理:比特币中的共识管理包括挖矿、区块验证和交易验证规则。比特币采用PoW共识机制,依赖机器进行哈希运算来获取记账权,同时每次达成共识需要全网共同参与运算,允许全网50%节点出错。密码模块:比特币采用RIMEMD和SHA-256算法及Base-58编码生成比特币地址。签名模块:比特币采用椭圆曲线secp256k1及数字签名算法ECDSA来实现数字签名并生成公钥。脚本引擎:比特币的脚本语言是一种基于堆栈的编程脚本,共有256个指令,是非图灵完备的运算平台,没有能力计算任意带复杂功能的任务。本课程从零到一带领你实践一个小型公链。  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值