BLC

package
v0.0.0-...-c7dd34c Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 21, 2021 License: AGPL-3.0 Imports: 21 Imported by: 0

Documentation

Index

Constants

View Source
const (
	//验证当前节点末端区块是否是最新区块
	CMD_VERSION = "version"
	//从最长链上获取区块
	CMD_GETBLOCKS = "getblocks"
	//向其他节点展示当前节点有哪些区块
	CMD_INV = "inv"
	//请求指定区块
	CMD_GETDATA = "getdata"
	//接收到新区块之后,进行处理
	CMD_BLOCK = "block"
)

命令分类

View Source
const CMMAND_LENGTH = 12

命令长度

View Source
const PROTOCOL = "tcp"

网络服务常量管理 协议

Variables

This section is empty.

Functions

func Base58Decode

func Base58Decode(input []byte) []byte

解码函数

Jh83

func Base58Encode

func Base58Encode(input []byte) []byte

编码函数

func CheckSum

func CheckSum(input []byte) []byte

生成校验和

func GetEnvNodeId

func GetEnvNodeId() string

获取节点ID

func IntToHex

func IntToHex(data int64) []byte

实现int64转[]byte

func IsValidArgs

func IsValidArgs()

参数数量的检测函数

func IsValidForAddress

func IsValidForAddress(addressBytes []byte) bool

判断地址的有效性

func JSONToSlice

func JSONToSlice(jsonString string) []string

标准JSON格式转切片 windows下需要添加引号 bc.exe send -from "[\"troytan\"]" -to "[\"Alice\"]" -amount "[\"5\"]" bc.exe send -from "[\"troytan\",\"Alice\"]" -to "[\"Alice\",\"troytan\"]" -amount "[\"5\",\"2\"]" troytan ->Alice 5 -->Alice 5 troytan 5 Alice ->troytan 2 -->Alice 3 troytan 7

func PrintUsage

func PrintUsage()

用法展示

func Reverse

func Reverse(data []byte)

反转切片函数

func Ripemd160Hash

func Ripemd160Hash(pubKey []byte) []byte

实现双哈希

func StringToHash160

func StringToHash160(address string) []byte

string 转hash160

Types

type Block

type Block struct {
	TimeStamp    int64          //区块时间戳,代表区块时间
	Hash         []byte         //当前区块哈希
	PreBlockHash []byte         //前区块哈希
	Height       int64          //区块高度
	Txs          []*Transaction //交易数据(交易列表)
	Nonce        int64          //在运行pow时生成的哈希变化值,也代表pow运行时动态修改的数据
}

区块基本结构与功能管理文件

func CreateGenesisBlock

func CreateGenesisBlock(txs []*Transaction) *Block

生成创世区块

func DeserializeBlock

func DeserializeBlock(blockBytes []byte) *Block

区块数据反序列化

func NewBlock

func NewBlock(height int64, preBlockHash []byte, txs []*Transaction) *Block

新建区块

func (*Block) HashTransaction

func (block *Block) HashTransaction() []byte

把指定区块中所有交易结构都序列化(类Merkle的哈希计算方法)

func (*Block) Serialize

func (block *Block) Serialize() []byte

区块结构序列化

type BlockChain

type BlockChain struct {
	//Blocks []*Block //区块的切片
	DB *bolt.DB //数据库对象

	Tip []byte //保存最新区块的哈希值
}

区块链的基本结构

func BlockChainObject

func BlockChainObject(nodeID string) *BlockChain

获取一个blockchain对象

func CreateBlockChainWithGenesisBlock

func CreateBlockChainWithGenesisBlock(address string, nodeID string) *BlockChain

初始化区块链

func (*BlockChain) AddBlock

func (bc *BlockChain) AddBlock(block *Block)

添加区块

func (*BlockChain) FindAllSpentOutputs

func (blockchain *BlockChain) FindAllSpentOutputs() map[string][]*TxInput

查找整条区块链所有已花费输出

func (*BlockChain) FindSpendableUTXO

func (blockchain *BlockChain) FindSpendableUTXO(from string, amount int, txs []*Transaction) (int, map[string][]int)

查找指定地址的可用UTXO,超过amount就中断查找 更新当前数据库中指定地址的UTXO数量 txs:缓存中的交易列表(用于多笔交易处理)

func (*BlockChain) FindTransaction

func (blockchain *BlockChain) FindTransaction(ID []byte) Transaction

通过指定的交易哈希查找交易

func (*BlockChain) FindUTXOMap

func (blockchain *BlockChain) FindUTXOMap() map[string]*TXOutputs

查找整条区块链中所有地址的UTXO

func (*BlockChain) GetBlock

func (bc *BlockChain) GetBlock(hash []byte) []byte

获取指定哈希的区块数据

func (*BlockChain) GetBlockHases

func (bc *BlockChain) GetBlockHases() [][]byte

获取区块链所有的区块哈希

func (*BlockChain) GetHeight

func (bc *BlockChain) GetHeight() int64

获取当前区块的区块高度

func (*BlockChain) Iterator

func (blc *BlockChain) Iterator() *BlockChainIterator

创建迭代器对象

func (*BlockChain) MineNewBlock

func (blockchain *BlockChain) MineNewBlock(from, to, amount []string, nodeID string)

实现挖矿功能 通过接收交易生成区块

func (*BlockChain) PrintChain

func (bc *BlockChain) PrintChain()

添加区块到区块链中

func (bc *BlockChain) AddBlock(txs []*Transaction)  {
	//更新区块数据(insert)
	err2:=bc.DB.Update(func(tx *bolt.Tx) error {
		//1.获取数据库桶
		b:=tx.Bucket([]byte(blockTableName))
		if nil!=b{
			//2.获取最后插入的区块
			blockBytes:=b.Get(bc.Tip)
			//3.区块数据反序列化
			latest_block:=DeserializeBlock(blockBytes)
			//3.新建区块
			newBlock:=NewBlock(latest_block.Height+1,latest_block.Hash,txs)
			//4.存入数据库
			err:=b.Put(newBlock.Hash,newBlock.Serialize())
			if err!=nil{
				log.Panicf("insert the new block to db failed %v\n",err)
			}
			//更新最新区块的哈希(数据库)
			err1:=b.Put([]byte("1"),newBlock.Hash)
			if err1!=nil{
				log.Panicf("updata the latest block hash to db failed %v\n",err1)
			}
			//更新区块连对象中的最新区块哈希
			bc.Tip=newBlock.Hash
		}
		return nil
	})
	if nil!=err2{
		log.Panicf("insert block to db failed%v\n",err2)
	}
}

遍历数据库,输出所有区块信息

func (*BlockChain) SignTransaction

func (blockchain *BlockChain) SignTransaction(tx *Transaction, privKey ecdsa.PrivateKey)

交易签名

func (*BlockChain) SpentOutput

func (blockchain *BlockChain) SpentOutput(address string) map[string][]int

获取指定地址所有已花费输出

func (*BlockChain) UnUTXOS

func (blockchain *BlockChain) UnUTXOS(address string, txs []*Transaction) []*UTXO

func (*BlockChain) VerifyTransaction

func (bc *BlockChain) VerifyTransaction(tx *Transaction) bool

验证签名

type BlockChainIterator

type BlockChainIterator struct {
	DB          *bolt.DB //迭代目标
	CurrentHash []byte   //当前接待目标的哈希
}

迭代器基本结构

func (*BlockChainIterator) Next

func (bcit *BlockChainIterator) Next() *Block

实现迭代函数next,获取到每一个区块

type BlockData

type BlockData struct {
	AddrFrom string //节点地址
	Block    []byte //区块数据(序列化数据)
}

type CLI

type CLI struct {
	BC *BlockChain //区块链对象
}

client对象

func (*CLI) CreateWallets

func (cli *CLI) CreateWallets(nodeID string)

创建钱包集合

func (*CLI) GetAccounts

func (cli *CLI) GetAccounts(nodeID string)

获取地址列表

func (*CLI) Run

func (cli *CLI) Run()

命令行运行函数

func (*CLI) SetNodeId

func (cli *CLI) SetNodeId(nodeId string)

设置端口号(环境变量)

func (*CLI) TestFindUTXOMap

func (cli *CLI) TestFindUTXOMap()

查找

func (*CLI) TestResetUTXO

func (cli *CLI) TestResetUTXO(nodeID string)

重置utxo table

type GetBlocks

type GetBlocks struct {
	AddrFrom string //从哪一个节点开始同步
}

type GetData

type GetData struct {
	AddrFrom string //当前地址
	ID       []byte //区块哈希
}

请求指定区块

type Inv

type Inv struct {
	AddrFrom string   //当前节点的地址
	Hashes   [][]byte //当前节点所拥有的区块的hash列表
}

展示

type MerkleNode

type MerkleNode struct {
	//左子节点
	Left *MerkleNode
	//右子节点
	Right *MerkleNode
	//数据
	Data []byte
}

Merkle节点结构

func MakeMerkleNode

func MakeMerkleNode(left, right *MerkleNode, data []byte) *MerkleNode

创建Merkle节点

type MerkleTree

type MerkleTree struct {
	//根节点
	RootNode *MerkleNode
}

Merkle树实现管理

func NewMerkleTree

func NewMerkleTree(txHashes [][]byte) *MerkleTree

创建Merkle树 txHashes:区块中的交易哈希列表 Merkle根节点之外的其它层次的节点数量必须是偶数个,如果是奇数个,则将最后一个节点复制一份

type ProofOfWork

type ProofOfWork struct {
	//需要共识验证的模块
	Block *Block
	// contains filtered or unexported fields
}

工作量证明的结构

func NewProofOfWork

func NewProofOfWork(block *Block) *ProofOfWork

创建一个POW对象

func (*ProofOfWork) Run

func (proofOfWork *ProofOfWork) Run() ([]byte, int)

执行pow,比较哈希值 返回哈希值,以及碰撞次数

type TXOutputs

type TXOutputs struct {
	TXOutputs []*TxOutput
}

func DeserializeTXOutputs

func DeserializeTXOutputs(txOutputsBytes []byte) *TXOutputs

输出集返回序列化

func (*TXOutputs) Serialize

func (txOutputs *TXOutputs) Serialize() []byte

输出集序列化

type Transaction

type Transaction struct {
	//交易哈希(标识)
	TxHash []byte
	//输入列表
	Vins []*TxInput
	//输出列表
	Vouts []*TxOutput
}

定义一个交易基本结构

func NewCoinbaseTransaction

func NewCoinbaseTransaction(address string) *Transaction

实现coinbase交易

func NewSimpleTransaction

func NewSimpleTransaction(from string, to string, amount int, bc *BlockChain, txs []*Transaction, nodeID string) *Transaction

生成普通转账交易

func (*Transaction) Hash

func (tx *Transaction) Hash() []byte

设置用于签名的交易的哈希

func (*Transaction) HashTransaction

func (tx *Transaction) HashTransaction()

生成交易哈希(交易序列化) 不同时间生成的交易哈希值不同

func (*Transaction) IsCoinbaseTransaction

func (tx *Transaction) IsCoinbaseTransaction() bool

判断指定的交易是否是一个coinbase交易

func (*Transaction) Serialize

func (tx *Transaction) Serialize() []byte

交易序列化

func (*Transaction) Sign

func (tx *Transaction) Sign(privateKey ecdsa.PrivateKey, prevTxs map[string]Transaction)

交易签名 prevTxs : 代表当前交易的输入所引用的所有OUTPUT松鼠的交易

func (*Transaction) TrimmedCopy

func (tx *Transaction) TrimmedCopy() Transaction

交易拷贝,生成一个专门用于交易签名的脚本

func (*Transaction) Verify

func (tx *Transaction) Verify(prevTxs map[string]Transaction) bool

验证签名

type TxInput

type TxInput struct {
	//交易哈希(不是指当前交易的哈希)
	TxHash []byte
	//引用的上一笔交易的输出索引号
	Vout int
	//数字签名
	Signature []byte
	//公钥
	PublicKey []byte
}

输入结构

func (*TxInput) UnLockRipemd160Hash

func (in *TxInput) UnLockRipemd160Hash(ripemd160Hash []byte) bool

传递哈希160进行判断

type TxOutput

type TxOutput struct {
	//金额
	Value int

	//ScriptPubkey  string
	//用户名(UTXO)的所有者
	Ripemd160Hash []byte
}

输出结构

func NewTxOutput

func NewTxOutput(value int, address string) *TxOutput

新建output对象

func (*TxOutput) UnLockScriptPubkeyWithAddress

func (TxOutput *TxOutput) UnLockScriptPubkeyWithAddress(address string) bool

output身份验证

type UTXO

type UTXO struct {
	//UTXO对应的交易哈希
	TxHash []byte
	//UTXO在其所属交易的输出列表中的索引
	Index int
	//Output本身
	Output *TxOutput
}

UTXO结构管理

type UTXOSet

type UTXOSet struct {
	Blockchain *BlockChain
}

func (*UTXOSet) FindUTXOWithAddress

func (utxoSet *UTXOSet) FindUTXOWithAddress(address string) []*UTXO

查找

func (*UTXOSet) GetBalance

func (utxoSet *UTXOSet) GetBalance(address string) int

查询余额

func (*UTXOSet) ResetUTXOSet

func (utxoSet *UTXOSet) ResetUTXOSet()

重置

type Version

type Version struct {
	//Version    int     //版本号
	Height   int    //当前节点区块高度
	AddrFrom string //当前节点的地址
}

当前区块版本信息(决定区块是否需要同步)

type Wallet

type Wallet struct {
	//1.私钥
	PrivateKey ecdsa.PrivateKey
	//2.公钥
	PublicKey []byte
}

钱包基本结构

func NewWallet

func NewWallet() *Wallet

创建一个钱包

func (*Wallet) GetAddress

func (w *Wallet) GetAddress() []byte

通过钱包(公钥)获取地址

type Wallets

type Wallets struct {
	//key : 地址
	//value : 钱包结构
	Wallets map[string]*Wallet
}

实现钱包集合的基本结构

func NewWallets

func NewWallets(nodeID string) *Wallets

初始化钱包集合

func (*Wallets) CreateWallet

func (wallets *Wallets) CreateWallet(nodeID string)

添加新的钱包到集合中

func (*Wallets) SaveWallets

func (w *Wallets) SaveWallets(nodeID string)

持久化钱包信息(存储到文件里)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL