以太坊之賬戶

一、外部賬戶

eth_account_gen.jpeg

外部賬戶創(chuàng)建流程:

  • 創(chuàng)建隨機私鑰(64位16進制字符/32字節(jié)): ecdsa.GenerateKey(crypto.S256(), rand)
  • 從私鑰推導(dǎo)出公鑰(128位16進制字符/64字節(jié)): privateKeyECDSA.PublicKey
  • 從公鑰推導(dǎo)出地址(40位16進制字符/20字節(jié)): Keccak256(pubBytes[1:])[12:]

當(dāng)使用geth account new命令新建賬戶晓锻,最終調(diào)用accountCreate(accountcmd.go)=>keystore.StoreKey=>storeNewKey(key.go)

func newKeyFromECDSA(privateKeyECDSA *ecdsa.PrivateKey) *Key {
    id, err := uuid.NewRandom()
    if err != nil {
        panic(fmt.Sprintf("Could not create random uuid: %v", err))
    }
    key := &Key{
        Id:         id,
        Address:    crypto.PubkeyToAddress(privateKeyECDSA.PublicKey), // 生成地址 Keccak256(pubBytes[1:])[12:]
        PrivateKey: privateKeyECDSA,
    }
    return key
}
func newKey(rand io.Reader) (*Key, error) {
    privateKeyECDSA, err := ecdsa.GenerateKey(crypto.S256(), rand) // 隨機生成私鑰
    if err != nil {
        return nil, err
    }
    return newKeyFromECDSA(privateKeyECDSA), nil
}

func storeNewKey(ks keyStore, rand io.Reader, auth string) (*Key, accounts.Account, error) {
    key, err := newKey(rand)
    if err != nil {
        return nil, accounts.Account{}, err
    }
    a := accounts.Account{
        Address: key.Address,
        URL:     accounts.URL{Scheme: KeyStoreScheme, Path: ks.JoinPath(keyFileName(key.Address))},
    }
    if err := ks.StoreKey(a.URL.Path, key, auth); err != nil {
        zeroKey(key.PrivateKey)
        return nil, a, err
    }
    return key, a, err
}

storeNewKey完成私鑰雌芽、公鑰、地址的生產(chǎn)继榆,最后保存成keystore文件到指定路徑。

最后保存的keystore文件為json格式,如下:

{
    "address": "26ce833a705af6846da8c1a43d1e418b93458137",  //賬戶地址
    "crypto": {
        //使用的加密算法,這里使用AES-CTR模式加密私鑰,分組模式是128比特
        "cipher": "aes-128-ctr",    
        //這是對原始私鑰加密后的私鑰的密文
        "ciphertext": "e2edc5df564536dcf7fb8bcfde99404215d8dd8327684e9d27327a267181a791",
        "cipherparams": {
            //這是向量
            "iv": "9847020ef0bb269b0c463d2ed4bb2ac4"
        },
        "kdf": "scrypt",
        "kdfparams": {
            "dklen": 32, //解密秘鑰的長度
        //進行加密解密運算的次數(shù),在越大的情況下,可以增加暴力破解的成本,也會使簽名速度變慢
            "n": 262144, 
        //設(shè)置為1為只能串行運算.0為并行運算.串行運算可以增加安全性.也會影響簽名速度
            "p": 1,
        //加密的分組長度
            "r": 8,
        //可以理解為隨機生成的向量
            "salt": "56fc7ac270cd1a357a2bc1959119f10df4b69fabb4d0c198d6527f3c0fe2df6b"
        },
        //這是解密私鑰密文的秘鑰的hash值,防止用戶輸入錯誤的密碼而計算出錯誤的私鑰.用與比對私鑰是否正確.
        "mac": "7fde1727799710cf122d441c57c50cbc8182f666cca5a7717a8cb3bb8d21639d"
    },
    "id": "1d6b8676-de36-441d-a736-2a8ee94019ea",
    "version": 3
}

以下為用密碼可以推出私鑰的流程


keystore_enc.png

二猾警、內(nèi)部賬戶

對交易發(fā)起人的地址和nonce進行RLP編碼孔祸,再算出Keccak哈希值,取后20個字節(jié)作為該合約的地址,即:Keccak-256(RLP(sender, nonce))[12:]
函數(shù)位于:crypto/crypto.go

// CreateAddress creates an ethereum address given the bytes and the nonce
func CreateAddress(b common.Address, nonce uint64) common.Address {
    data, _ := rlp.EncodeToBytes([]interface{}{b, nonce})
    return common.BytesToAddress(Keccak256(data)[12:])
}

三发皿、賬戶結(jié)構(gòu)

賬戶在區(qū)塊鏈上的存儲結(jié)構(gòu)崔慧,內(nèi)外賬戶的結(jié)構(gòu)都是一樣

type Account struct {
    Nonce    uint64      // 賬戶發(fā)起交易的次數(shù)
    Balance  *big.Int    // 賬戶的余額
    Root     common.Hash // 合約賬戶存儲空間的一棵MPT樹的根節(jié)點的Hash
    CodeHash []byte      // 合約代碼的Hash值
}
account_diff.png

文章github地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市穴墅,隨后出現(xiàn)的幾起案子惶室,更是在濱河造成了極大的恐慌,老刑警劉巖玄货,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皇钞,死亡現(xiàn)場離奇詭異,居然都是意外死亡松捉,警方通過查閱死者的電腦和手機夹界,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惩坑,“玉大人掉盅,你說我怎么就攤上這事∫允妫” “怎么了趾痘?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蔓钟。 經(jīng)常有香客問我永票,道長,這世上最難降的妖魔是什么滥沫? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任侣集,我火速辦了婚禮,結(jié)果婚禮上兰绣,老公的妹妹穿的比我還像新娘世分。我一直安慰自己,他們只是感情好缀辩,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布臭埋。 她就那樣靜靜地躺著,像睡著了一般臀玄。 火紅的嫁衣襯著肌膚如雪瓢阴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天健无,我揣著相機與錄音荣恐,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛叠穆,可吹牛的內(nèi)容都是我干的少漆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼痹束,長吁一口氣:“原來是場噩夢啊……” “哼检疫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起祷嘶,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤屎媳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后论巍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烛谊,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年嘉汰,在試婚紗的時候發(fā)現(xiàn)自己被綠了丹禀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡鞋怀,死狀恐怖双泪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情密似,我是刑警寧澤焙矛,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站残腌,受9級特大地震影響村斟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抛猫,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一蟆盹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闺金,春花似錦逾滥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哎壳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尚卫,已是汗流浹背归榕。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吱涉,地道東北人刹泄。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓外里,卻偏偏與公主長得像,于是被迫代替她去往敵國和親特石。 傳聞我的和親對象是個殘疾皇子盅蝗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容