亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用golang怎么創建錢包并遍歷錢包

發布時間:2021-05-13 16:00:16 來源:億速云 閱讀:229 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關使用golang怎么創建錢包并遍歷錢包,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

代碼實現

func (cli *CLI) createWallet(nodeID string) {     //創建錢包的主函數
    wallets, _ := NewWallets(nodeID)   
    address := wallets.CreateWallet()
    wallets.SaveToFile(nodeID)

    fmt.Printf("Your new address: %s\n", address)
}

我們慢慢的分析這個程序,其中的NewWallets()函數如下,在這里先是定義了一個錢包集合,我們利用wallets結構體存儲多個錢包,將他們保存到文件中或者從文件中進行加載,每個錢包都保存了一堆公鑰和私鑰。創建出了一個空的錢包集合后,便開始加載以前的錢包集合文件

func NewWallets(nodeID string) (*Wallets, error) {
    wallets := Wallets{}
    wallets.Wallets = make(map[string]*Wallet)
    err := wallets.LoadFromFile(nodeID)
    return &wallets, err
}

type Wallets struct {
    Wallets map[string]*Wallet
}
type Wallet struct {
    PrivateKey ecdsa.PrivateKey
    PublicKey  []byte
}
func (ws *Wallets) LoadFromFile(nodeID string) error {
    walletFile := fmt.Sprintf(walletFile, nodeID)    
    if _, err := os.Stat(walletFile); os.IsNotExist(err) {   //判斷文件是否存在
        return err
    }

    fileContent, err := ioutil.ReadFile(walletFile)
    // ReadFile 讀取文件中的所有數據,返回讀取的數據和遇到的錯誤。
    //如果讀取成功,則 err 返回 nil,而不是 EOF
func ReadFile(filename string) ([]byte, error)
    if err != nil {
        log.Panic(err)
    }

    var wallets Wallets
    gob.Register(elliptic.P256())
    //gob是Golang包自帶的一個數據結構序列化的編碼/解碼工具。
    decoder := gob.NewDecoder(bytes.NewReader(fileContent))
    err = decoder.Decode(&wallets)//這里應該是一個解碼的過程
    if err != nil {
        log.Panic(err)
    }
    ws.Wallets = wallets.Wallets
    return nil
}

再來看一看wallets.CreateWallet()方法,其中的NewWallet()如下, NewWallet()函數創建了一個錢包,我們可以根據公鑰打印出相應的錢包對應的地址,然后將錢包存儲到錢包集合結構體中

unc (ws *Wallets) CreateWallet() string {
    wallet := NewWallet()
    address := fmt.Sprintf("%s", wallet.GetAddress())
    ws.Wallets[address] = wallet  //存儲到錢包集合中
    return address
}
func NewWallet() *Wallet {
    private, public := newKeyPair()   //得到公鑰和私鑰
    wallet := Wallet{private, public}  //存儲到錢包結構體
    return &wallet
}
func newKeyPair() (ecdsa.PrivateKey, []byte) {
    curve := elliptic.P256()
    private, err := ecdsa.GenerateKey(curve, rand.Reader)
    if err != nil {
        log.Panic(err)
    }
    pubKey := append(private.PublicKey.X.Bytes(), private.PublicKey.Y.Bytes()...)
    return *private, pubKey
}

//由公鑰得到地址,具體方法見我的博客用 [“go語言實現比特幣地址校驗”](https://blog.csdn.net/m0_37719047/article/details/81945896) 
func (w Wallet) GetAddress() []byte {     
    pubKeyHash := HashPubKey(w.PublicKey)  
    versionedPayload := append([]byte{version}, pubKeyHash...)
    checksum := checksum(versionedPayload)
    fullPayload := append(versionedPayload, checksum...)
    address := Base58Encode(fullPayload)
    return address
}

最后將創建好的錢包更新到存儲錢包集合的文件中去

func (ws Wallets) SaveToFile(nodeID string) {
    var content bytes.Buffer     //開辟一個內存空間
    walletFile := fmt.Sprintf(walletFile, nodeID)
    gob.Register(elliptic.P256())
    encoder := gob.NewEncoder(&content)    //序列化結構體
    err := encoder.Encode(ws)
    if err != nil {
        log.Panic(err)
    }
    err = ioutil.WriteFile(walletFile, content.Bytes(), 0644)    //將序列化的數據寫入到文件中去
    if err != nil {
        log.Panic(err)
    }
}

如果我們需要打印錢包集合中所有錢包對應的地址,我們可以利用以下的函數進行遍歷。

func (cli *CLI) listAddresses(nodeID string) {
    wallets, err := NewWallets(nodeID)   //加載現有的錢包集合
    if err != nil {
        log.Panic(err)
    }
    addresses := wallets.GetAddresses()
    for _, address := range addresses {
        fmt.Println(address)
    }
}
func (ws *Wallets) GetAddresses() []string {
    var addresses []string
    for address := range ws.Wallets {
        addresses = append(addresses, address)
    }
    return addresses
}

什么是golang

golang 是Google開發的一種靜態強類型、編譯型、并發型,并具有垃圾回收功能的編程語言,其語法與 C語言相近,但并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數等功能。

以上就是使用golang怎么創建錢包并遍歷錢包,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

潢川县| 萨迦县| 芜湖县| 思茅市| 军事| 青铜峡市| 凯里市| 海南省| 桦南县| 莒南县| 天祝| 大厂| 镇安县| 铅山县| 栾城县| 浦县| 定兴县| 临高县| 贵州省| 齐齐哈尔市| 道真| 梁山县| 镇康县| 永宁县| 巴林左旗| 新建县| 桂东县| 莱西市| 来凤县| 安远县| 庆元县| 柳河县| 赤城县| 双桥区| 铜鼓县| 大同市| 嘉义县| 阳江市| 阿拉善右旗| 吉木乃县| 东平县|