最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語言實現(xiàn)簡易比特幣系統(tǒng)錢包的原理解析

 更新時間:2021年04月07日 10:23:06   作者:小圣.  
這篇文章主要介紹了go語言實現(xiàn)簡易比特幣系統(tǒng)錢包的原理解析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

錢包基礎(chǔ)概念

  • 廣義上,錢包是一個應(yīng)用程序,為用戶提供交互界面。錢包控制用戶訪問權(quán)限、管理比特比地址及秘鑰、跟蹤余額、創(chuàng)建交易和簽名交易
  • 狹義上,即從程序員角度來看,“錢包”是指用于存儲和管理用戶秘鑰的數(shù)據(jù)結(jié)構(gòu)
  • 錢包是私鑰的容器,一般是通過結(jié)構(gòu)化文件或簡單數(shù)據(jù)庫來實現(xiàn)的
  • 錢包中并不包含比特幣。比特幣是被記錄在比特幣網(wǎng)絡(luò)的區(qū)塊鏈中,用戶通過錢包中的密鑰簽名交易,從而控制網(wǎng)絡(luò)中的比特幣,在某種意義上,比特幣錢包就是密鑰鏈

錢包結(jié)構(gòu)體

type Wallet struct {
	//私鑰
	Private *ecdsa.PrivateKey
	//約定,這里的PubKey不存儲原始的公鑰,而是存儲X和Y拼接的字符串,在校驗端重新拆分(參考r,s傳遞)
	PubKey []byte
}

創(chuàng)建錢包

func NewWallet() *Wallet {
	//創(chuàng)建曲線
	curve := elliptic.P256()
	//生成私鑰
	privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)
	if err != nil {
		log.Panic(err)
	}

	//生成公鑰
	pubKeyOrig := privateKey.PublicKey

	//拼接X, Y
	pubKey := append(pubKeyOrig.X.Bytes(), pubKeyOrig.Y.Bytes()...)

	return &Wallet{Private: privateKey, PubKey: pubKey}
}

錢包集結(jié)構(gòu)體

//定一個 Wallets結(jié)構(gòu),它保存所有的wallet以及它的地址
type Wallets struct {
	//map[地址]錢包
	WalletsMap map[string]*Wallet
}

創(chuàng)建錢包集

func NewWallets() *Wallets {
  var ws Wallets
  ws.WalletsMap = make(map[string]*Wallet)
  //加載本地錢包,把新建的錢包保存到本地
  ws.loadFile()
  return &ws
}

創(chuàng)建錢包到錢包集

func (ws *Wallets) CreateWallet() string {
	//創(chuàng)建一個錢包
	wallet := NewWallet()
	address := wallet.NewAddress()

	//添加到錢包集
	ws.WalletsMap[address] = wallet

	//保存包本地
	ws.saveToFile()
	//返回創(chuàng)建錢包的地址
	return address
}

保存錢包到本地

func (ws *Wallets) saveToFile() {

	var buffer bytes.Buffer

	gob.Register(elliptic.P256())

	encoder := gob.NewEncoder(&buffer)
	err := encoder.Encode(ws)
	//一定要注意校驗?。。?
	if err != nil {
		log.Panic(err)
	}

	ioutil.WriteFile(walletFile, buffer.Bytes(), 0600)
}

讀取錢包集里的錢包

func (ws *Wallets) loadFile() {
	//在讀取之前,要先確認文件是否在,如果不存在,直接退出
	_, err := os.Stat(walletFile)
	if os.IsNotExist(err) {
		return
	}

	//讀取內(nèi)容
	content, err := ioutil.ReadFile(walletFile)
	if err != nil {
		log.Panic(err)
	}

	//解碼
	gob.Register(elliptic.P256())

	decoder := gob.NewDecoder(bytes.NewReader(content))

	var wsLocal Wallets

	err = decoder.Decode(&wsLocal)
	if err != nil {
		log.Panic(err)
	}

	ws.WalletsMap = wsLocal.WalletsMap
}

列出所有錢包的地址

func (ws *Wallets) ListAllAddresses() []string {
	var addresses []string
	//遍歷錢包,將所有的key取出來返回
	for address := range ws.WalletsMap {
		addresses = append(addresses, address)
	}

	return addresses
}

生成錢包地址

  • 隨機選取32byte的數(shù)字作為私鑰
  • 使用橢圓曲線加密算法(ECDSA-secp256k1)計算私鑰對應(yīng)的非壓縮公鑰
  • 計算公鑰的SHA-256哈希值
  • 取上一步結(jié)果,計算RIPEMD-160哈希值
  • 取上一步結(jié)果,前面加上版本號(比特幣主網(wǎng)版本號“0x00”)
  • 取上一步結(jié)果,計算SHA-256哈希值
  • 取上一步結(jié)果,計算SHA-256哈希值
  • 取上一步結(jié)果的前4個字節(jié)(8位十六進制)
  • 把這4個字節(jié)加在第五步的結(jié)果后面,作為校驗(這就是比特幣地址的十六進制形態(tài))
  • 用base58表示法變換一下地址(這就是常見的比特幣地址形態(tài))
//生成地址
func (w *Wallet) NewAddress() string {
	//錢包公鑰
	pubKey := w.PubKey

	//計算公鑰哈希和ripe160
	rip160HashValue := HashPubKey(pubKey)
	//主網(wǎng)版本號為0x00
	version := byte(00)
	//拼接version
	payload := append([]byte{version}, rip160HashValue...)

	//校驗碼checksum
	checkCode := CheckSum(payload)

	//拼接版本、哈希值、校驗碼、25字節(jié)數(shù)據(jù)
	payload = append(payload, checkCode...)

	//base58編碼
	address := base58.Encode(payload)

	return address
}

結(jié)束

源碼:https://gitee.com/xiaoshengdada/go_bitcoin/tree/master/v5

到此這篇關(guān)于go語言實現(xiàn)簡易比特幣系統(tǒng)錢包的原理解析的文章就介紹到這了,更多相關(guān)go實現(xiàn)比特幣錢包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于context.Context的Golang?loader緩存請求放大問題解決

    基于context.Context的Golang?loader緩存請求放大問題解決

    這篇文章主要為大家介紹了基于context.Context的Golang?loader緩存請求放大解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Golang中的sync.WaitGroup用法實例

    Golang中的sync.WaitGroup用法實例

    這篇文章主要介紹了Golang中的sync.WaitGroup用法實例,WaitGroup的用途,它能夠一直等到所有的goroutine執(zhí)行完成,并且阻塞主線程的執(zhí)行,直到所有的goroutine執(zhí)行完成,需要的朋友可以參考下
    2015-07-07
  • GoLang中panic與recover函數(shù)以及defer語句超詳細講解

    GoLang中panic與recover函數(shù)以及defer語句超詳細講解

    這篇文章主要介紹了GoLang的panic、recover函數(shù),以及defer語句,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • 詳解如何在Go項目中輸出版本信息

    詳解如何在Go項目中輸出版本信息

    這篇文章主要介紹了詳解如何在Go項目中輸出版本信息,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Go?不支持?[]T轉(zhuǎn)換為[]interface類型詳解

    Go?不支持?[]T轉(zhuǎn)換為[]interface類型詳解

    這篇文章主要為大家介紹了Go不支持[]T轉(zhuǎn)換為[]interface類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Go語言中的內(nèi)存布局詳解

    Go語言中的內(nèi)存布局詳解

    這篇文章主要給大家介紹了Go語言中的內(nèi)存布局,那么本文中將嘗試解釋Go如何在內(nèi)存中構(gòu)建結(jié)構(gòu)體,以及結(jié)構(gòu)體在字節(jié)和比特位方面是什么樣子。 有需要的朋友們可以參考借鑒,感興趣的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • 在Go中使用jwt的教程詳解

    在Go中使用jwt的教程詳解

    JWT (JSON Web Tokens) 是一種基于 JSON 格式的輕量級身份驗證和授權(quán)方案,用于在各方之間以JSON方式安全地傳輸信息,本文給大家詳細介紹了在Go中使用jwt的教程,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-06-06
  • Go語言學(xué)習(xí)之接口類型(interface)詳解

    Go語言學(xué)習(xí)之接口類型(interface)詳解

    接口是用來定義行為的類型,定義的行為不由接口直接實現(xiàn),而由通過方法由定義的類型實現(xiàn),本文就來和大家詳細講講Go語言中接口的使用吧
    2023-03-03
  • Go語言死鎖與goroutine泄露問題的解決

    Go語言死鎖與goroutine泄露問題的解決

    最近在工作中使用golang編程,今天的文章給大家分享一下Go語言死鎖與goroutine泄露問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • golang中beego入門

    golang中beego入門

    Beego是一個基于Go語言的開源框架,用于構(gòu)建Web應(yīng)用程序和API,本文主要介紹了golang中beego入門,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12

最新評論

沅江市| 靖宇县| 延安市| 新干县| 榆树市| 永州市| 平塘县| 浑源县| 板桥市| 五台县| 密云县| 韩城市| 沭阳县| 阳曲县| 惠水县| 郎溪县| 印江| 婺源县| 裕民县| 宁国市| 东方市| 嵊州市| 永年县| 阜平县| 瓦房店市| 玉田县| 永川市| 西乡县| 娄底市| 阳城县| 仁布县| 迭部县| 博兴县| 漳平市| 金华市| 阿拉善左旗| 肃宁县| 调兵山市| 鹰潭市| 赣榆县| 上蔡县|