golang[47]-区块链-比特币交易

栏目: Go · 发布时间: 7年前

内容简介:第一笔交易比较特殊,他是coinbase交易,矿工的收益。金额每4年减少一半,从2009年一开始一个区块奖励50BTC、后来减少为了25个BTC、一直到18年 12.5BTC。总共有2100万BTC。交易和我们的银行的转账非常不同,比特币中没有记录账户的信息、而是交易的信息。

比特币的交易

第一笔交易比较特殊,他是coinbase交易,矿工的收益。

金额每4年减少一半,从2009年一开始一个区块奖励50BTC、后来减少为了25个BTC、一直到18年 12.5BTC。总共有2100万BTC。

交易和我们的银行的转账非常不同,比特币中没有记录账户的信息、而是交易的信息。

go实现交易 demo

package main

import (
	"bytes"
	"encoding/gob"
	"log"
	"crypto/sha256"
	"fmt"
	"strings"
)
const subsidy = 100
type Transation struct{
	ID []byte
	Vin []TXInput
	Vout []TXOutput

}


 type TXInput struct {
 	TXid []byte
 	Voutindex int
 	Signature []byte
 }

type TXOutput struct {
	value int
	PubkeyHash []byte
}

//格式化打印交易完整信息
func (tx Transation) String() string {
	var lines []string

	lines = append(lines, fmt.Sprintf("--- Transaction %x:", tx.ID))

	for i, input := range tx.Vin {
		lines = append(lines, fmt.Sprintf("     Input %d:", i))
		lines = append(lines, fmt.Sprintf("       TXID:      %x", input.TXid))
		lines = append(lines, fmt.Sprintf("       Out:       %d", input.Voutindex))
		lines = append(lines, fmt.Sprintf("       Signature: %x", input.Signature))
	}

	for i, output := range tx.Vout {
		lines = append(lines, fmt.Sprintf("     Output %d:", i))
		lines = append(lines, fmt.Sprintf("       Value:  %d", output.value))
		lines = append(lines, fmt.Sprintf("       Script: %x", output.PubkeyHash))
	}

	return strings.Join(lines, "\n")
}


//序列化
func (tx Transation) Serialize() []byte{
	var encoded bytes.Buffer
	enc:= gob.NewEncoder(&encoded)

	 err:= enc.Encode(tx)

	 if err!=nil{
	 	log.Panic(err)
	 }
	 return encoded.Bytes()
}
//计算交易的hash值
func (tx *Transation) Hash() []byte{

	txcopy := *tx
	txcopy.ID = []byte{}

	hash:= sha256.Sum256(txcopy.Serialize())

	return hash[:]
}

//根据金额与地址新建一个输出
func NewTXOutput(value int,address string) * TXOutput{
	  txo := &TXOutput{value,nil}
	  txo.PubkeyHash = []byte(address)
	  return txo
}



//第一笔coinbase交易
func NewCoinbaseTX(to string) *Transation{
	txin := TXInput{[]byte{},-1,nil}
	txout := NewTXOutput(subsidy,to)

	tx:= Transation{nil,[]TXInput{txin},[]TXOutput{*txout}}

	tx.ID = tx.Hash()

	return &tx
}




func main(){
	newTX := NewCoinbaseTX("jonson")
	fmt.Printf("%s",newTX.String())

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入理解Java虚拟机

深入理解Java虚拟机

周志明 / 机械工业出版社 / 2011-6 / 69.00元

《深入理解Java虚拟机:JVM高级特性与最佳实践》内容简介:作为一位Java程序员,你是否也曾经想深入理解Java虚拟机,但是却被它的复杂和深奥拒之门外?没关系,本书极尽化繁为简之妙,能带领你在轻松中领略Java虚拟机的奥秘。本书是近年来国内出版的唯一一本与Java虚拟机相关的专著,也是唯一一本同时从核心理论和实际运用这两个角度去探讨Java虚拟机的著作,不仅理论分析得透彻,而且书中包含的典型案......一起来看看 《深入理解Java虚拟机》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具