1. nonce
以太坊里的nonce有兩種意思廉油,一個是proof of work nonce,一個是account nonce栖雾。
- Proof of Work nonce:一個無意義的值,可以通過調整值得大小來試圖滿足proof of work的condition。這其實就是挖礦的本質村怪。這個值使得找出滿足proof of work condition的值變成了一個依靠運氣的計算密集型的工作。
-
Account nonce:每個帳戶中用來防止重放攻擊的交易計數(shù)器浮庐。例如甚负,一筆從A到B發(fā)送20個幣的交易可以被B不斷重復來消耗A的余額。
這是為了防止雙花攻擊啦审残。舉個例子比如說 - 你發(fā)出了一筆帶有normal GASPRICE的交易梭域,正等著被礦工加到塊里。
- 你發(fā)出了另一筆帶有high GASPRICE的交易想使得在第一次交易之前進行第二次交易搅轿, 使得第一筆交易無效病涨。
在以太坊中交易中有一個nonce域,double-spends就不會發(fā)生璧坟,nonce2的交易不會在nonce1的交易之前被添加進塊(也就是be mined)既穆,還要注意的是nonce不能被跳過,也就是說要是你發(fā)送了一個nonce3的交易但是沒有發(fā)送nonce2雀鹃,那么這個交易就沒用循衰。nonce一定要是順序的, no skips.
在智能合約里,nonce的值代表的是該合約創(chuàng)建的合約數(shù)量褐澎。只有當一個合約創(chuàng)建另一個合約的時候才會增加nonce的值会钝。但是當一個合約調用另一個合約中的method時 nonce的值是不變的。
在以太坊中nonce的值可以這樣來獲裙と(其實也就是屬于一個賬戶的交易數(shù)量):
eth.getTransactionCount(accountAddress)
但是這個方法只能獲取交易once的值迁酸。目前是沒有內置方法來訪問contract中的nonce值的
2,以太坊的公私鑰俭正,地址的關系
通過橢圓曲線算法生成鑰匙對(公鑰和私鑰)奸鬓,以太坊采用的是secp256k1曲線,
公鑰采用uncompressed模式,生成的私鑰為長度32字節(jié)的16進制字串掸读,公鑰為長度64的公鑰字串串远。公鑰04開頭。
把公鑰去掉04儿惫,剩下的進行keccak-256的哈希澡罚,得到長度64字節(jié)的16進制字串,丟掉前面24個肾请,拿后40個留搔,再加上"0x",即為以太坊地址铛铁。
整個過程可以歸納為:
Get Private-key[32字節(jié)] -> Public-key[64字節(jié)]-> (Keccak-256(
Public-key))-> Address [20字節(jié)]
secp256k1 -> 19784D0BCAE8E040DE1A33DAA74C749A1309BBD5E7776B3881F83531CE279636 -> ... -> 0xDD55dA111fBfcc671966D138dE7DFA249a6e76cC
3, BASE64和BASE58的區(qū)別隔显?
2)有些網(wǎng)關或系統(tǒng)只能使用ASCII字符却妨。Base64就是用來將非ASCII字符的數(shù)據(jù)轉換成ASCII字符的一種方法,而且base64特別適合在http括眠,mime協(xié)議下快速傳輸數(shù)據(jù)彪标。Base64使用【字母azAZ數(shù)字09和+/】這64個字符編碼。原理是將3個字節(jié)轉換成4個字節(jié)(3 X 8) = 24 = (4 X 6)
當剩下的字符數(shù)量不足3個字節(jié)時掷豺,則應使用0進行填充捞烟,相應的,輸出字符則使用'='占位萌业,因此編碼后輸出的文本末尾可能會出現(xiàn)1至2個'='坷襟。
1)Base58是用于Bitcoin中使用的一種獨特的編碼方式,主要用于產(chǎn)生Bitcoin的錢包地址生年。相比Base64婴程,Base58不使用數(shù)字"0",字母大寫"O"抱婉,字母大寫"I"档叔,和字母小寫"l",以及"+"和"/"符號蒸绩。
Base58Check是一種常用在比特幣中的Base58編碼格式衙四,增加了錯誤校驗碼來檢查數(shù)據(jù)在轉錄中出現(xiàn)的錯誤。 校驗碼長4個字節(jié)患亿,添加到需要編碼的數(shù)據(jù)之后传蹈。校驗碼是從需要編碼的數(shù)據(jù)的哈希值中得到的,所以可以用來檢測并避免轉錄和輸入中產(chǎn)生的錯誤步藕。使用 Base58check編碼格式時惦界,編碼軟件會計算原始數(shù)據(jù)的校驗碼并和結果數(shù)據(jù)中自帶的校驗碼進行對比。二者不匹配則表明有錯誤產(chǎn)生咙冗,那么這個 Base58Check格式的數(shù)據(jù)就是無效的沾歪。例如,一個錯誤比特幣地址就不會被錢包認為是有效的地址雾消,否則這種錯誤會造成資金的丟失灾搏。
為了使用Base58Check編碼格式對數(shù)據(jù)(數(shù)字)進行編碼,首先我們要對數(shù)據(jù)添加一個稱作“版本字節(jié)”的前綴立润,這個前綴用來明確需要編碼的數(shù) 據(jù)的類型狂窑。例如,比特幣地址的前綴是0(十六進制是0x00)范删,而對私鑰編碼時前綴是128(十六進制是0x80)蕾域。 表4-1會列出一些常見版本的前綴。
接下來到旦,我們計算“雙哈现枷铮”校驗碼,意味著要對之前的結果(前綴和數(shù)據(jù))運行兩次SHA256哈希算法:
checksum = SHA256(SHA256(prefix+data))
在產(chǎn)生的長32個字節(jié)的哈希值(兩次哈希運算)中添忘,我們只取前4個字節(jié)采呐。這4個字節(jié)就作為校驗碼。校驗碼會添加到數(shù)據(jù)之后搁骑。
結果由三部分組成:前綴斧吐、數(shù)據(jù)和校驗碼。這個結果采用之前描述的Base58字母表編碼仲器。下圖描述了Base58Check編碼的過程煤率。
相同:
- 一般都用于URL, 郵件文本, 可見字符顯示.
- 都會造成信息冗余, 數(shù)據(jù)量增大, 因此不會用于大數(shù)據(jù)傳輸編碼.
區(qū)別: - 編碼集不同, base 58 的編碼集在 base 64 的字符集的基礎上去掉了比較容易混淆的字符.
- base 64 采用直接切割 bit 的方法(8->6), 而 base 58 采用大數(shù)進制轉換, 效率更低, 使用場景更少.
Note: base 58 解碼時需要將長度傳入, 這點與 base 64 有區(qū)別, 在代碼實現(xiàn)時應注意.
10,參考
1) 哈希算法乏冀、Merkle樹蝶糯、公鑰密碼算法
https://blog.csdn.net/s_lisheng/article/details/77937202?from=singlemessage
2)全新的 SHA-3 加密標準 —— Keccak
https://blog.csdn.net/renq_654321/article/details/79797428
3)在線加密算法
http://tools.jb51.net/password/hash_md5_sha
4)比特幣地址生成算法詳解
https://www.cnblogs.com/zhaoweiwei/p/address.html
5)Base58Check編碼實現(xiàn)示例
https://blog.csdn.net/QQ604666459/article/details/82419527
6) 比特幣交易中的簽名與驗證
http://www.reibang.com/p/a21b7d72532f