1. 程式人生 > >利用go語言獲取比特幣餘額

利用go語言獲取比特幣餘額

如何獲取餘額

我們輸入一個比特幣地址,然後獲取對應比特幣地址擁有者對應的pubkey,由該公鑰檢測utxo集,獲取未花費交易,累加value,從而獲取地址對應的餘額

程式碼實現

func (cli *CLI) getBalance(address, nodeID string) {
    if !ValidateAddress(address) {
        log.Panic("ERROR: Address is not valid")
    }
    bc := NewBlockchain(nodeID)
    UTXOSet := UTXOSet{bc}
    defer
bc.db.Close() balance := 0 pubKeyHash := Base58Decode([]byte(address)) pubKeyHash = pubKeyHash[1 : len(pubKeyHash)-4] UTXOs := UTXOSet.FindUTXO(pubKeyHash) for _, out := range UTXOs { balance += out.Value } fmt.Printf("Balance of '%s': %d\n", address, balance) } type
Blockchain struct { tip []byte Db *bolt.DB } type UTXOSet struct { Blockchain *Blockchain }

第一步ValidateAddress(address)檢測地址的有效性,詳細程式碼解釋見我的部落格
第二步從資料庫中獲取區塊鏈例項,我們將區塊鏈儲存在資料庫中,如果你沒有使用資料庫儲存,可以直接獲取區塊鏈例項,然後建立一個utxo集合

func NewBlockchain(nodeID string) *Blockchain {
    dbFile := fmt.Sprintf(dbFile, nodeID)
    if
dbExists(dbFile) == false { fmt.Println("No existing blockchain found. Create one first.") os.Exit(1) } var tip []byte db, err := bolt.Open(dbFile, 0600, nil) if err != nil { log.Panic(err) } err = db.Update(func(tx *bolt.Tx) error { b := tx.Bucket([]byte(blocksBucket)) tip = b.Get([]byte("l")) return nil }) if err != nil { log.Panic(err) } bc := Blockchain{tip, db} return &bc }

第三步將地址變為公鑰的hash
這裡寫圖片描述
該圖片是由公鑰變化為地址的示意圖,從而解釋程式碼意圖

    pubKeyHash := Base58Decode([]byte(address))    //解碼
    pubKeyHash = pubKeyHash[1 : len(pubKeyHash)-4]    //去掉版本號和校驗碼

第四步是找到所有的UTXO

func (u UTXOSet) FindUTXO(pubKeyHash []byte) []TXOutput {
    var UTXOs []TXOutput
    db := u.Blockchain.db
    err := db.View(func(tx *bolt.Tx) error {
        b := tx.Bucket([]byte(utxoBucket))
        c := b.Cursor()
        for k, v := c.First(); k != nil; k, v = c.Next() {
            outs := DeserializeOutputs(v)
            for _, out := range outs.Outputs {
                if out.IsLockedWithKey(pubKeyHash) {   //如果公鑰hash能夠解鎖UTXO集合中的交易輸出,則該交易內部的值屬於該地址
                    UTXOs = append(UTXOs, out)   //新增到UTXOS中
                }
            }
        }
        return nil
    })
    if err != nil {
        log.Panic(err)
    }
    return UTXOs
}
func (out *TXOutput) IsLockedWithKey(pubKeyHash []byte) bool {
    return bytes.Compare(out.PubKeyHash, pubKeyHash) == 0
}

最後將輸出後的UTXOs進行遍歷,將餘額進行累加,就能夠找到餘額

參考

相關推薦

利用go語言獲取餘額

如何獲取餘額 我們輸入一個比特幣地址,然後獲取對應比特幣地址擁有者對應的pubkey,由該公鑰檢測utxo集,獲取未花費交易,累加value,從而獲取地址對應的餘額 程式碼實現 func (cli *CLI) getBalance(address,

python3.6 獲取最新的行業咨詢 關註

比特幣 .python3.6 行業資訊 ```#!/usr/bin/env python # -*- coding:utf-8 -*- #Author: Mr Gee import requests import urllib from urllib import request import

教你5步獲取

本文在Mac環境下測試,windows類似 測試網路被設計來替代 Bitcoin block chain,用於測試。它允許程式開發者或 bitcoin 試用者進行試驗性的操作,而不用擔心破費 bitcoin 或破解 bitcoin chain. 預設你是安裝了了比特幣核心錢包的,如

如何使用不同語言訪問類庫bitcoinj

對於需要廣泛深入的理解bitcoinj,防止緩衝區溢位和Android手機可很好的應用,Java是一個很好的選擇。但它也有老問題,冗長而且通常也不適合所有人。 本頁詳細介紹了其他程式設計開發語言如何使用bitcoinj。 Javascript Javascrip

一鍵獲取的挖礦軟體

很多網友都聽說過比特幣,今天小編就給大家介紹一款一鍵無腦獲取比特幣的挖礦軟體,希望大家都能通過這個電腦軟體獲取屬於自己的比特幣。 哈魚礦工挖礦軟體 開啟哈魚礦工軟體,輸入手機號建立賬戶。 現在正值該軟體的活動期間,註冊就可領取比特幣紅包。 我們可以看見,這個

利用樹莓派挖

1. 前言:                  你需要理解比特幣的概念                  你需要知道樹莓派的計算能力,比起  顯示卡挖礦、烤貓usb挖礦等效能低很多                   如果你想折騰就來吧! 2. 準備:          

地址生成過程 go語言版本

比特幣地址結構: 【版本 + 公鑰雜湊 + 驗證碼】 版本:預設0x00, 即可空白的一位元組。 公鑰:由非對稱加密演算法得出。 公鑰雜湊:就是給公鑰做雜湊演算法得出的結果。 驗證碼:給 [版本 + 公鑰雜湊],sha256兩次,取頭4個字元作為驗證碼。 package main

Go語言學習(三) 簡單挖礦類實現

//utils.go package main import ( "bytes" "encoding/binary" "log" ) func IntToHex(num int64)[]byte{ buff:=new(bytes.Buffer) //開闢記憶體,

2000行程式碼用go語言實現的基本的相關模型功能

|版權宣告:本文為博主原創文章,未經博主允許不得轉載。部落格地址:https://blog.csdn.net/sgsgy5 前言:閒暇時期,參考了一些資料,用go簡單的實現了比特幣中的一些相關功能,實現完全大概2000行程式碼左右,現在剛利用閒暇時間寫了一點小

區塊鏈系列----go語言原始碼-BTCD整體架構

前言 筆者一直致力於區塊鏈底層技術研究。本文將講下第一代區塊鏈(比特幣),go語言版本BTCD原始碼整體架構。 如果你是剛入門區塊鏈技術,那麼筆者建議可以先學習下blockchain_go。 blockchain_go:一個簡單的go語言實現的區塊鏈工程(

關於病毒利用445端口加密系統的處理辦法

microsoft windows 修改註冊表 系統有些端口是我們平時用不到但是又存在危險的端口,例如139、135、445等端口,windows默認是開著的,這時我們可以手動關閉這些端口!關閉445端口的方法!方法二1.請在控制面板>程序>啟用或關閉windows功能>取消勾選

利用Google趨勢來預測價格

bit ogl 信息 同時 googl 是什麽 什麽是 貨幣 git 預測市場是件極其困難和不可能的事情,特別是預測市場的短期行為。長期預期相對而言簡單很多,因為很多事情把時間拉長,都可以預測,比如我預測燒汽油的車最終都會消失,或者極端點,人類終會消失,把時間拉長,都是沒問

指令碼語言

指令碼是一種簡單的指令碼語言,也是比特幣交易處理的核心。如果你曾經寫過彙編程式碼,你會發現這篇文章很容易理解,而且可能是有趣的;否則它可能是特別具挑戰性的。所以請保持專注! 遇上機器碼 指令碼是計算機程式,作為程式設計師,你當然知道程式是什麼。程式接受輸入,執行一段時間,然後返回輸出

golang[42]-區塊鏈-go實戰默克爾樹

go實戰比特幣默克爾樹 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686

go實現橢圓曲線加解密、簽名驗證演算法(go ecdsa庫的運用),及生成地址過程講解、base58實現

go實現橢圓曲線加解密、簽名驗證演算法(go ecdsa庫的運用),及生成比特幣地址過程講解、BASE58實現 前言 本文主要講解使用Go的ecdsa庫實現橢圓曲線加解密、簽名、驗證演算法,同時通過公鑰生成比特幣地址,具體程式碼邏輯參考bitcoin0

如何獲取和使用錢包?一分鐘就可搞定!

比特幣錢包的功能其實就像實物錢包一樣,裡面可以儲存你的比特幣資訊,包括比特幣地址(類似於你的銀行卡賬號)、私鑰(類似於你銀行卡的密碼),而且比特幣錢包還分為冷錢包,熱錢包等,其實也就是私鑰的儲存方式不同。為了方便礦友們使用,在這裡推薦兩款線上錢包(熱錢包) blockchain,Coinbase。

利用Bitcoin Core(核心錢包)和Testnet(測試網路)體驗交易

 彷彿一夜之間,加密貨幣和其背後的區塊鏈技術就這麼火了起來,而最大的功臣非比特幣莫屬。短短一年裡,比特幣的價格報漲了幾十倍,讓不少投資者一夜暴富,嚐盡甜頭。而有些人則將之比喻為鬱金香泡沫,認為這是二十一世紀的一場全球性的鬧劇,然而更多的人還是想趕上這趟二十一世紀最具科技與財富前景的快車。只是虛擬貨幣涉及到許許

應對新型“蠕蟲”式勒索軟件“wannacry”的緊急措施

parameter ren win mod deny arc ear tope blog 1.防火墻屏蔽445端口 命令行操作: 以管理員打開命令行執行以下命令 netsh firewall set opmode enable netsh advfirewall

(Onion)病毒預防方法

windows services 進入註冊表 比特幣病毒來襲,目前受影響的系統大都為Windows系統,Linux系統、MAC系統還未出現,防禦目前最主要手段是禁止系統高危端口、系統補丁升級及安裝殺毒軟件。Windows系統存在很多被黑客利用的危險端口,例如135、136、137、138、13

病毒事件是否證明中國網絡安全不堪一擊?

比特幣病毒事件是否證明中國網絡安全不堪一擊?先簡單聊聊這兩天比特幣事件:時間:2017-05-12 08:00起風險:電腦只要聯網,有445端口隱患,就有可能中比特幣病毒,然後數據被加密,勒索不少錢財。影響範圍:Windows ALL。(微軟甚至最後連xp 2003都更新了補丁)處理方式:斷網數據備份,防火墻