理解以太坊(eth)需要理解其中比較重要的幾個(gè)概念
地址和私鑰相當(dāng)于我們?nèi)粘I钪械馁~戶和密碼,不過也不完全相同。
- 地址和私鑰是一對一關(guān)系,私鑰決定地址,不可修改
- 地址可公開用于身份標(biāo)示,私鑰不可公開用于簽名交易
- 私鑰可以導(dǎo)出地址,地址無法反推私鑰

我們可以用下面的代碼生成一個(gè)地址
package main
import (
"crypto/ecdsa"
"fmt"
"log"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto"
)
func main() {
// 生成私鑰
privateKey, err := crypto.GenerateKey()
if err != nil {
log.Fatal(err)
}
privateKeyBytes := crypto.FromECDSA(privateKey)
fmt.Println("私鑰為: " + hexutil.Encode(privateKeyBytes))
// 私鑰導(dǎo)出地址
publicKey := privateKey.Public()
publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
if !ok {
log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey")
}
address := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()
fmt.Println("地址為: " + address)
}
運(yùn)行將看到類似的輸出
私鑰為: 0x7e311abd6aa962e388ffba96cec31053ee617c4f238ef47ad8213785db01ebba
地址為: 0xab8599e59B6B6e0BB574403a9daB6864dd94c3EE
區(qū)塊(block)和交易(transaction)
以太坊(eth)本質(zhì)是一個(gè)賬本。賬本由順序排列的區(qū)塊(block)組成,而區(qū)塊(block)由若干個(gè)交易(transaction)組成。

深入理解區(qū)塊和交易我們可以借助eth區(qū)塊鏈瀏覽器,其中比較著名的eth區(qū)塊鏈瀏覽器為etherscan
我們重點(diǎn)關(guān)注一下交易(transaction)里的數(shù)據(jù)內(nèi)容。

這里我們重點(diǎn)介紹一下 gas和gasprice 以及 nonce
Gas和Gas Price以及手續(xù)費(fèi)
Gas直接翻譯是汽油的意思,在這里我們可以理解為買個(gè)交易(transaction)消耗的資源。
- Gas Limit: 在創(chuàng)建這個(gè)交易時(shí),允許交易消耗的最大的gas數(shù)值,如果交易在實(shí)際執(zhí)行中,所消耗的gas大于了這個(gè)值,則交易直接失敗,不生效,但是手續(xù)費(fèi)還是需要扣除。單純的eth轉(zhuǎn)賬交易,gas消耗固定為21000。非固定消耗來源與合約交易,我們暫不考慮。
- Gas Used by Transaction: 交易中真實(shí)使用的gas值。在合約中,成功的交易大部分這個(gè)數(shù)值會(huì)小于Gas Limit。
Gas Price是Gas的單價(jià)。交易需要礦工打包,打包的優(yōu)先級(jí)和Gas Price成正比,注意,不是和手續(xù)費(fèi)總額成正比。也就是說,Gas Price越高,將被越早打包。這個(gè)值的單位顯示一般為xxGwei。這里介紹一下eth的金額單位。
- 1 Ether = 1,000,000,000,000,000,000 wei (10的18次方)
- 1 Ether = 1,000,000,000,000,000 Kwei (10的15次方)
- 1 Ether = 1,000,000,000,000 Mwei (10的12次方)
- 1 Ether = 1,000,000,000 Gwei (10的9次方)
- 1 Ether = 1,000,000 Szabo (10的6次方)
- 1 Ether = 1,000 Finney (10的3次方)
- 1 Ether = 0.001 Kether
- 1 Ether = 0.000001 Mether
- 1 Ether = 0.000000001 Gether
- 1 Ether = 0.000000000001 Tether
手續(xù)費(fèi)是本次交易實(shí)際上付出的eth金額
以截圖中的交易為例,Gas為21000,Gas Price為2.6Gwei
手續(xù)費(fèi)則為
21000 * 2.6Gwei = 54600Gwei = 54600 * 10^9 Wei = 54600000000000 Wei = (54600000000000 / 10^18)Ether = 0.0000546Ether
真正交易的時(shí)候,我們想盡快打包的情況下如何更節(jié)省手續(xù)費(fèi)呢?這是我們可以參考一個(gè)叫ethgasstation的網(wǎng)站,里面為我們提供了可以參考的Gas Price的數(shù)值,并同時(shí)提供了API可以實(shí)時(shí)查詢。

nonce
nonce都是相對與From而言的,也就是打款地址。nonce的出現(xiàn)是為了避免重放攻擊。例如0xA地址廣播了一筆轉(zhuǎn)賬給0xB的交易,因?yàn)榻灰讛?shù)據(jù)都是公開的,誰都能拿到這個(gè)交易的數(shù)據(jù),如果0xB再廣播一次這個(gè)交易,是不是0xB會(huì)再收到一筆eth呢?
nonce就避免了這種情況的出現(xiàn)。
假設(shè)0xA->0xB的第一筆交易nonce為0并已經(jīng)打包,0xB再廣播一遍的時(shí)候,大家發(fā)現(xiàn),0xA的nonce的0已經(jīng)用過了,于是就忽略了這個(gè)廣播,就避免了二次打款的情況。
但是有一個(gè)問題需要注意,nonce相對與一個(gè)地址是從0開始的,并且是順序的。在同一個(gè)地址nonce為5的交易沒有被打包之前該地址nonce>5的交易永遠(yuǎn)不會(huì)被打包。
這里還涉及到一個(gè)交易替換的問題,比如0xA有一個(gè)nonce為1的交易是給0xB打款,在還沒有打包前,0xA又廣播了一個(gè)nonce為1但是Gas Price比之前那個(gè)交易高的給0xC打款的交易,則給0xC打款的交易會(huì)頂替給0xB打款的交易。也就是給0xB打款的交易會(huì)失效。
以上就是關(guān)于以太坊(eth)比較簡略的一個(gè)說明。