您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關使用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 是Google開發的一種靜態強類型、編譯型、并發型,并具有垃圾回收功能的編程語言,其語法與 C語言相近,但并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數等功能。
以上就是使用golang怎么創建錢包并遍歷錢包,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。