Documentation
¶
Index ¶
- func Base58Decode(input []byte) []byte
- func Base58Encode(input []byte) []byte
- func HashPubKey(pubKey []byte) []byte
- func IntToHex(num int64) []byte
- func ReverseBytes(data []byte)
- func ValidateAddress(address string) bool
- type Block
- type Blockchain
- func (bc *Blockchain) FindSpendableOutput(pubKeyHash []byte, amount int) (int, map[string][]int)
- func (bc *Blockchain) FindTransaction(ID []byte) (Transaction, error)
- func (bc *Blockchain) FindUTXO(pubKeyHash []byte) []TxOutput
- func (bc *Blockchain) FindUnspentTransaction(pubKeyHash []byte) []Transaction
- func (bc *Blockchain) Iterator() *BlockchainIterator
- func (bc *Blockchain) MineBlock(transactions []*Transaction)
- func (bc *Blockchain) SignTransaction(tx *Transaction, privKey ecdsa.PrivateKey)
- func (bc *Blockchain) VerifyTransaction(tx *Transaction) bool
- type BlockchainIterator
- type CLI
- type ProofOfWork
- type Transaction
- func (tx *Transaction) Hash() []byte
- func (tx Transaction) IsCoinbase() bool
- func (tx Transaction) Serialize() []byte
- func (tx *Transaction) Sign(privKey ecdsa.PrivateKey, prevTXs map[string]Transaction)
- func (tx Transaction) String() string
- func (tx *Transaction) TrimmedCopy() Transaction
- func (tx *Transaction) Verify(prevTXs map[string]Transaction) bool
- type TxInput
- type TxOutput
- type Wallet
- type Wallets
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Block ¶
type Block struct { Timestamp int64 Transactions []*Transaction //存储交易数据,不再是字符串数据了 PrevBlockHash []byte Nonce int Hash []byte }
Block 区块结构新版,增加了计数器nonce,主要目的是为了校验区块是否合法 即挖出的区块是否满足工作量证明要求的条件
func DeserializeBlock ¶
DeserializeBlock 反序列化,注意返回的是Block的指针(引用)
func NewBlock ¶
func NewBlock(transactions []*Transaction, prevBlockHash []byte) *Block
NewBlock 创建普通区块 一个block里面可以包含多个交易
func NewGenesisBlock ¶
func NewGenesisBlock(coninbase *Transaction) *Block
NewGenesisBlock 创建创始区块,包含创始交易。注意,创建创始区块也需要挖矿。
func (*Block) HashTransactions ¶
HashTransactions 计算交易组合的哈希值 获得每笔交易的哈希,将它们关联起来,然后获得一个连接后的组合哈希
type Blockchain ¶
Blockchain 区块链结构 我们不在里面存储所有的区块了,而是仅存储区块链的 tip。 另外,我们存储了一个数据库连接。因为我们想要一旦打开它的话,就让它一直运行,直到程序运行结束。
func CreatBlockchain ¶
func CreatBlockchain(address string) *Blockchain
CreatBlockchain 创建一个全新的区块链数据库 address用户发起创始交易,并挖矿,奖励也发给用户address 注意,创建后,数据库是open状态,需要使用者负责close数据库
func (*Blockchain) FindSpendableOutput ¶
FindSpendableOutput 查找某个用户可以花费的输出,放到一个映射里面 从未花费交易里取出未花费的输出,直至取出输出的币总数大于或等于需要send的币数为止
func (*Blockchain) FindTransaction ¶
func (bc *Blockchain) FindTransaction(ID []byte) (Transaction, error)
FindTransaction 根据交易ID查询到一个交易
func (*Blockchain) FindUTXO ¶
func (bc *Blockchain) FindUTXO(pubKeyHash []byte) []TxOutput
FindUTXO 从未花费交易取得所有未花费输出
func (*Blockchain) FindUnspentTransaction ¶
func (bc *Blockchain) FindUnspentTransaction(pubKeyHash []byte) []Transaction
FindUnspentTransaction 查找未花费的交易(即该交易的花费尚未花出,换句话说, 及该交易的输出尚未被其他交易作为输入包含进去)
func (*Blockchain) Iterator ¶
func (bc *Blockchain) Iterator() *BlockchainIterator
Iterator 每当需要对链中的区块进行迭代时候,我们就通过Blockchain创建迭代器 注意,迭代器初始状态为链中的tip,因此迭代是从最新到最旧的进行获取
func (*Blockchain) MineBlock ¶
func (bc *Blockchain) MineBlock(transactions []*Transaction)
MineBlock 挖出普通区块并将新区块加入到区块链中 此方法通过区块链的指针调用,将修改区块链bc的内容
func (*Blockchain) SignTransaction ¶
func (bc *Blockchain) SignTransaction(tx *Transaction, privKey ecdsa.PrivateKey)
SignTransaction 对一个交易的所有输入引用的输出的交易进行签名 注意,这里签名的不是参数tx(当前交易),而是tx输入所引用的输出的交易
func (*Blockchain) VerifyTransaction ¶
func (bc *Blockchain) VerifyTransaction(tx *Transaction) bool
VerifyTransaction 验证一个交易的所有输入的签名
type BlockchainIterator ¶
type BlockchainIterator struct {
// contains filtered or unexported fields
}
BlockchainIterator 区块链迭代器,用于对区块链中的区块进行迭代
func (*BlockchainIterator) Next ¶
func (i *BlockchainIterator) Next() *Block
Next 区块链迭代,返回当前区块,并更新迭代器的currentHash为当前区块的PrevBlockHash
type ProofOfWork ¶
type ProofOfWork struct {
// contains filtered or unexported fields
}
ProofOfWork POW结构体 可以看出,每一个pow实例与具体的block相关 但在确定好挖矿难度系数后,所有区块的pow的target是相同的, 除非挖矿系数随着时间推移,挖矿难度系数不断增加
func NewProofOfWork ¶
func NewProofOfWork(b *Block) *ProofOfWork
NewProofOfWork 初始化创建一个POW的函数,以block指针为参数(将修改该block) 主要目的是确定target
func (*ProofOfWork) Run ¶
func (pow *ProofOfWork) Run() (int, []byte)
Run POW挖矿核心算法实现,注意,这是一个方法,不是函数, 因为挖矿的完整描述是:挖出包含某个实际交易信息(或数据)的区块 挖矿是为交易上链提供服务,矿工拿到交易信息后进行挖矿,挖出的有效区块将包含交易信息 有可能挖不出符合条件的区块,所以将区块上链之前,需要对挖出的区块进行验证(验证是否符合条件)
type Transaction ¶
type Transaction struct { ID []byte //交易ID Vin []TxInput //交易输入,由上次交易输入(可能多个) Vout []TxOutput //交易输出,由本次交易产生(可能多个) }
Transaction 交易结构,代表一个交易
func NewCoinbaseTX ¶
func NewCoinbaseTX(to, data string) *Transaction
NewCoinbaseTX 创建一个区块链创始交易,不需要签名
func NewUTXOTransaction ¶
func NewUTXOTransaction(from, to string, amount int, bc *Blockchain) *Transaction
NewUTXOTransaction 创建一个资金转移交易并签名(对输入签名) from、to均为Base58的地址字符串
func (Transaction) IsCoinbase ¶
func (tx Transaction) IsCoinbase() bool
IsCoinbase 检查交易是否是创始区块交易 创始区块交易没有输入,详细见NewCoinbaseTX tx.Vin只有一个输入,数组长度为1 tx.Vin[0].Txid为[]byte{},因此长度为0 Vin[0].Vout设置为-1
func (*Transaction) Sign ¶
func (tx *Transaction) Sign(privKey ecdsa.PrivateKey, prevTXs map[string]Transaction)
Sign 对交易中的每一个输入进行签名,需要把输入所引用的输出交易prevTXs作为参数进行处理
func (*Transaction) TrimmedCopy ¶
func (tx *Transaction) TrimmedCopy() Transaction
TrimmedCopy 创建一个修剪后的交易副本(深度拷贝的副本),用于签名用 由于TrimmedCopy是在tx签名前执行,实际上修剪只是在tx基础上,将输入Vin中的每一个vin的PubKey置为nil
func (*Transaction) Verify ¶
func (tx *Transaction) Verify(prevTXs map[string]Transaction) bool
Verify 校验所有交易输入的签名 私钥签名,公钥验证
type TxInput ¶
type TxInput struct { Txid []byte //前一笔交易的ID Vout int //前一笔交易在该笔交易所有输出中的索引(一笔交易可能有多个输出,需要有信息指明具体是哪一个) Signature []byte //输入数据签名 //PubKey公钥,是发送者的钱包的公钥,用于解锁输出 //如果PubKey与所引用的锁定输出的PubKey相同,那么引用的输出就会被解锁,然后被解锁的值就可以被用于产生新的输出 //如果不正确,前一笔交易的输出就无法被引用在输入中,或者说,也就无法使用这个输出 //这种机制,保证了用户无法花费其他人的币 PubKey []byte }
TxInput 交易的输入 包含的是前一笔交易的一个输出
type TxOutput ¶
TxOutput 交易的输出
func NewTxOutput ¶
NewTxOutput 创建一个新的 TXOutput 注意,这里需要将address进行反编码成实际的地址
func (*TxOutput) IsLockedWithKey ¶
IsLockedWithKey 检查输出是否能够被公钥pubKeyHash拥有者使用