最近雖然AI很是火紅,不過大家別忘了去年最火的其實比起AI,當時最火的是加密貨幣(應該吧

在去(前)年的各路新聞中,你總是可以聽到某新聞說什麼大學生持有多少比特幣身價破億的新聞

或者是誰誰誰買了NFT因此翻轉人生

或者是某平凡人士因為買賣了狗狗幣因此買了跑車之類的話題

 

結果這些新聞就再去年俄烏戰爭以來,由於全球性的通膨加上能源市場萎縮,牽連到整個華爾街經濟市場

因此導致了無論是美股,連加密貨幣市場也跟著一路大跌,然後那吵死人的媒體就改去報導其他的阿貓阿狗了(笑)

 

好啦,說了那麼多。我其實並沒有想特別表達什麼(喂

我只想講的是,今天我想做一個跟加密貨幣相關的範例出來而已XD

而今天的範例有在使用加密貨幣的朋友應該心靈神會,今天我想寫一隻「創造加密貨幣錢包」的程式

而要特別注意的是,雖然這個錢包的算法應該也可以套到其他幣種,不過今天要創立的錢包主要是在Cosmos鏈上的加密貨幣錢包

而該錢包與之對應的就是Keplr錢包

->https://www.keplr.app/

 

因此在今天的範例中,我除了透過程式生成錢包地址、公鑰私鑰跟助記詞外

我也會當場把這個助記詞匯入Keplr錢包以驗證結果

總之說了那麼多,先來看結果圖吧

截圖 2023-04-08 下午7.53.40

這裡有個不良示範,註記詞還有私鑰這個東西是千萬千萬不能洩漏的XDDD

不過因為我主旨是在寫程式,也沒打算往裡邊匯錢什麼的,因此就算了吧(大笑

好啦,既然是查詢我的標題進來的,那我也不再多說廢話廢話,開始吧!

 

 


 

1. 寫程式

 

恩,跟以往的Android教學文不同,因為這算後端的東西,因此直接開始寫程式啦(笑

在開始之前,首先需要載入cosmospy這套函式庫

他的Github在這,大家可以去看看

->https://github.com/hukkin/cosmospy

基本上在他的說明欄內也把程式寫得很清楚了,他透過封裝了python提供的加密函式,幫我們包裝了從建立錢包~送傳輸的各種方式

不過關於送傳輸的部分我目前也還沒看,因此等我哪天看了之後應該也會寫一篇吧(笑

 

那總之先載入吧,請在CMD輸入以下載入

pip install cosmospy

 

OK,跑完之後,在輸入以下程式

 

main.py

 

# install: pip install cosmospy
import binascii

from cosmospy import BIP32DerivationError, seed_to_privkey, privkey_to_pubkey, pubkey_to_address, privkey_to_address
from cosmospy.typing import Wallet
import mnemonic


def m_generate_wallet(*, path: str = "m/44'/118'/0'/0/0", hrp: str = "cosmos") -> Wallet:
    # 12字註記詞設定12824字設定256
    while True:
        phrase = mnemonic.Mnemonic(language="english").generate(strength=128)
        try:
            privkey = seed_to_privkey(phrase, path=path)
            break
        except BIP32DerivationError:
            pass
    pubkey = privkey_to_pubkey(privkey)
    address = pubkey_to_address(pubkey, hrp=hrp)
    return {
        "seed": phrase,
        "derivation_path": path,
        "private_key": privkey,
        "public_key": pubkey,
        "address": address,
    }


if __name__ == '__main__':
    wallet = m_generate_wallet()
    print("Mnemonic: ", wallet["seed"])
    print("Public Key: ", wallet["public_key"])
    print("Public Keyhex: ", binascii.hexlify(wallet["public_key"]))
    print("Private Key: ", wallet["private_key"])
    print("Private Keyhex: ", binascii.hexlify(wallet["private_key"]))
    print("Derivation_path: ", wallet["derivation_path"])
    try:
        privkey = seed_to_privkey(wallet["seed"], path="m/44'/118'/0'/0/0")

        print("Cosmos: " + privkey_to_address(privkey, hrp="cosmos"))
        print("Osmo: " + privkey_to_address(privkey, hrp="osmo"))
        print("LikeCoin: " + privkey_to_address(privkey, hrp="like"))

    except BIP32DerivationError:
        print("No valid private key in this derivation path!")

 

學廢了嗎

 

好啦,其實還是簡單說一下

在這支程式做的就兩事,一是生成加密貨幣錢包(並返回地址及私鑰等資訊),二則是使用該私鑰再去生成各加密貨幣的專用地址

就拿本文的例子好了,在Cosmos練上的加密貨幣通常地址都會是該練名稱開頭+地址

因此若從私鑰去轉換的話,僅僅在前面加入該錢包的名稱即可

因此像是使用這支程式去轉換的話,LikeCoin出來的結果就會像這樣

截圖 2023-04-08 下午8.44.41

 

再來請關注一下這一段

def m_generate_wallet(*, path: str = "m/44'/118'/0'/0/0", hrp: str = "cosmos") -> Wallet:
    # 12字註記詞設定12824字設定256
    while True:
        phrase = mnemonic.Mnemonic(language="english").generate(strength=128)
        try:
            privkey = seed_to_privkey(phrase, path=path)
            break
        except BIP32DerivationError:
            pass
    pubkey = privkey_to_pubkey(privkey)
    address = pubkey_to_address(pubkey, hrp=hrp)
    return {
        "seed": phrase,
        "derivation_path": path,
        "private_key": privkey,
        "public_key": pubkey,
        "address": address,
    }

 

其實這一段他是有寫在函式庫裡的,直接調就可以了

不過我還是把它拿出來重寫了,原因是在於他預設的函式助記詞是24個,不過其實我在接觸加密貨幣時,基本上還是以12個助記詞是比較大宗的

而要如何生成12個助記詞呢?答案就是修改與之相符的長度即可

一般的長度大概就是128跟256最常見,就是俗稱的SHA128跟SHA256加密方式

 

不過其實助記詞除了12跟24之外,也有15、18、21的選項可以使用

所對應的長度則分別為160、192、224三個長度

雖然在實務中不常有,不過記一下也沒損失(應該?

 

好啦,關於創建的部分就到此,希望各位有執行出來

接下來就來驗證一下這個註記詞匯入Keplr錢包的話會有什麼結果

 


 

2. 驗證

 

好,接下來我試著將剛才取的助記詞加入到Keplr內

由於Keplr預設並沒有LikeCoin,因此我先驗證ATMO(Cosmos)跟OSMO的結果就好

這邊將我取得到的註記詞輸入一下

Memo:

Mnemonic:  delay patrol coin excuse orphan middle option eyebrow clinic receive bundle later
Public Key:  b'\x03\xa9\\7\xe0\x0b\xd62\x07\x8d\xc78\xa0\x83 t\xce\x90j\x91\x1f\xe0\xde\x0c\xf0Ez(\x1d\xde\xb5\xe3\xd3'
Public Key(hex):  b'03a95c37e00bd632078dc738a0832074ce906a911fe0de0cf0457a281ddeb5e3d3'
Private Key:  b'\x8a&m\xbb|\x80F\xe7\x1a\x88\x12\x91U\x14\xce3\xf2\xde\\\xe8\x19`j\xc4=\xa5(C\x9d\x90\xd1\x06'
Private Key(hex):  b'8a266dbb7c8046e71a8812915514ce33f2de5ce819606ac43da528439d90d106'
Derivation_path:  m/44'/118'/0'/0/0
Cosmos: cosmos1pzgpps9ygvvw2mu20xhtzfcfe7u52ua5c5tuhv
Osmo: osmo1pzgpps9ygvvw2mu20xhtzfcfe7u52ua5s0cvp7
LikeCoin: like1pzgpps9ygvvw2mu20xhtzfcfe7u52ua5tgh75h

 

得到的結果

cosmos1pzgpps9ygvvw2mu20xhtzfcfe7u52ua5c5tuhv

osmo1pzgpps9ygvvw2mu20xhtzfcfe7u52ua5s0cvp7

截圖 2023-04-08 下午9.43.42

恩,看來是沒有問題,Address有對上了,nice!

 


 

3. 後續

 

這篇文章只有提及創建錢包的方法而已,其實離加密貨幣的各種操作還是有一段距離

而如果說到如何轉賬或者如何獲取到各幣種中的帳戶餘額的話,這我之後會再研究,研究出來的話也會在寫文章分享

而就著思路上來說,其方法應該是去相對應的網站或社群找出那條鏈的node URL,然後將地址丟進去查詢

像我所知道的,LikeCoin的地址是

https://mainnet-node.like.co/

而Cosmos是

https://node.atomscan.com/

 

僅此,但其他的鏈我就還沒去調查了,就等哪天我調查好後再發表吧XD

好咧,那今天的文章就寫到這邊,如果本文對你有幫助的話..

TK

arrow
arrow

    碼農日常 發表在 痞客邦 留言(1) 人氣()