導航:首頁 > 以太坊區 > 以太坊如何記錄字元串

以太坊如何記錄字元串

發布時間:2023-08-02 14:30:20

① 急!在線等! 輸入一個字元串,過濾此串,只保留串中的字母字 符,並統計新生成串中包含的字母個數

string s = "fds23jfdslf323";
string newStr = "";
for(int i = 0; i < s.Length; i++)
{
int tmp = (int)s[i];
if((tmp >= 65 && tmp <= 90) || (tmp >= 97 && tmp <= 122))
{
newStr += s[i];
}
}
最後可以用newStr.Length 來獲取新字元串的字母個數,因為這個字元串中,肯定全是字母啦。

② 【深度知識】以太坊數據序列化RLP編碼/解碼原理

RLP(Recursive Length Prefix),中文翻譯過來叫遞歸長度前綴編碼,它是以太坊序列化所採用的編碼方式。RLP主要用於以太坊中數據的網路傳輸和持久化存儲。

對象序列化方法有很多種,常見的像JSON編碼,但是JSON有個明顯的缺點:編碼結果比較大。例如有如下的結構:

變數s序列化的結果是{"name":"icattlecoder","sex":"male"},字元串長度35,實際有效數據是icattlecoder 和male,共計16個位元組,我們可以看到JSON的序列化時引入了太多的冗餘信息。假設以太坊採用JSON來序列化,那麼本來50GB的區塊鏈可能現在就要100GB,當然實際沒這么簡單。

所以,以太坊需要設計一種結果更小的編碼方法。

RLP編碼的定義只處理兩類數據:一類是字元串(例如位元組數組),一類是列表。字元串指的是一串二進制數據,列表是一個嵌套遞歸的結構,裡面可以包含字元串和列表,例如["cat",["puppy","cow"],"horse",[[]],"pig",[""],"sheep"]就是一個復雜的列表。其他類型的數據需要轉成以上的兩類,轉換的規則不是RLP編碼定義的,可以根據自己的規則轉換,例如struct可以轉成列表,int可以轉成二進制(屬於字元串一類),以太坊中整數都以大端形式存儲。

從RLP編碼的名字可以看出它的特點:一個是遞歸,被編碼的數據是遞歸的結構,編碼演算法也是遞歸進行處理的;二是長度前綴,也就是RLP編碼都帶有一個前綴,這個前綴是跟被編碼數據的長度相關的,從下面的編碼規則中可以看出這一點。

對於值在[0, 127]之間的單個位元組,其編碼是其本身。

例1:a的編碼是97。

如果byte數組長度l <= 55,編碼的結果是數組本身,再加上128+l作為前綴。

例2:空字元串編碼是128,即128 = 128 + 0。

例3:abc編碼結果是131 97 98 99,其中131=128+len("abc"),97 98 99依次是a b c。

如果數組長度大於55, 編碼結果第一個是183加數組長度的編碼的長度,然後是數組長度的本身的編碼,最後是byte數組的編碼。

請把上面的規則多讀幾篇,特別是數組長度的編碼的長度。

例4:編碼下面這段字元串:

The length of this sentence is more than 55 bytes, I know it because I pre-designed it
這段字元串共86個位元組,而86的編碼只需要一個位元組,那就是它自己,因此,編碼的結果如下:

184 86 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
其中前三個位元組的計算方式如下:

184 = 183 + 1,因為數組長度86編碼後僅佔用一個位元組。
86即數組長度86
84是T的編碼
例5:編碼一個重復1024次"a"的字元串,其結果為:185 4 0 97 97 97 97 97 97 ...。
1024按 big endian編碼為004 0,省略掉前面的零,長度為2,因此185 = 183 + 2。

規則1~3定義了byte數組的編碼方案,下面介紹列表的編碼規則。在此之前,我們先定義列表長度是指子列表編碼後的長度之和。

如果列表長度小於55,編碼結果第一位是192加列表長度的編碼的長度,然後依次連接各子列表的編碼。

注意規則4本身是遞歸定義的。
例6:["abc", "def"]的編碼結果是200 131 97 98 99 131 100 101 102。
其中abc的編碼為131 97 98 99,def的編碼為131 100 101 102。兩個子字元串的編碼後總長度是8,因此編碼結果第一位計算得出:192 + 8 = 200。

如果列表長度超過55,編碼結果第一位是247加列表長度的編碼長度,然後是列表長度本身的編碼,最後依次連接各子列表的編碼。

規則5本身也是遞歸定義的,和規則3相似。

例7:

["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]
的編碼結果是:

248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
其中前兩個位元組的計算方式如下:

248 = 247 +1
88 = 86 + 2,在規則3的示例中,長度為86,而在此例中,由於有兩個子字元串,每個子字元串本身的長度的編碼各佔1位元組,因此總共佔2位元組。
第3個位元組179依據規則2得出179 = 128 + 51
第55個位元組163同樣依據規則2得出163 = 128 + 35

例8:最後我們再來看個稍復雜點的例子以加深理解遞歸長度前綴,

["abc",["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]]
編碼結果是:

248 94 131 97 98 99 248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
列表第一項字元串abc根據規則2,編碼結果為131 97 98 99,長度為4。
列表第二項也是一個列表項:

["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]
根據規則5,結果為

248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
長度為90,因此,整個列表的編碼結果第二位是90 + 4 = 94, 佔用1個位元組,第一位247 + 1 = 248

以上5條就是RPL的全部編碼規則。

各語言在具體實現RLP編碼時,首先需要將對像映射成byte數組或列表兩種形式。以go語言編碼struct為例,會將其映射為列表,例如Student這個對象處理成列表["icattlecoder","male"]

如果編碼map類型,可以採用以下列表形式:

[["",""],["",""],["",""]]

解碼時,首先根據編碼結果第一個位元組f的大小,執行以下的規則判斷:

1.如果f∈ [0,128),那麼它是一個位元組本身。

2.如果f∈[128,184),那麼它是一個長度不超過55的byte數組,數組的長度為 l=f-128

3.如果f∈[184,192),那麼它是一個長度超過55的數組,長度本身的編碼長度ll=f-183,然後從第二個位元組開始讀取長度為ll的bytes,按照BigEndian編碼成整數l,l即為數組的長度。

4.如果f∈(192,247],那麼它是一個編碼後總長度不超過55的列表,列表長度為l=f-192。遞歸使用規則1~4進行解碼。

5.如果f∈(247,256],那麼它是編碼後長度大於55的列表,其長度本身的編碼長度ll=f-247,然後從第二個位元組讀取長度為ll的bytes,按BigEndian編碼成整數l,l即為子列表長度。然後遞歸根據解碼規則進行解碼。

以上解釋了什麼叫遞歸長度前綴編碼,這個名字本身很好的解釋了編碼規則。

(1) 以太坊源碼學習—RLP編碼( https://segmentfault.com/a/1190000011763339 )
(2)簡單分析RLP編碼原理
( https://blog.csdn.net/itchosen/article/details/78183991 )

比特幣使用教程

比特幣是一種建立在全球網路上的貨幣。
比特幣是一種沒有央行參與發行的,總量固定的數字貨幣
比特幣建立在全球的P2P網路上。
全球無數的P2P節點全天候的在維護著比特幣的網路。
英文:bitcoin 貨幣符號: 英文縮寫:BTC或 XBT。

維基網路對比特幣的介紹:

Bitcoin與傳統貨幣不同,比特幣運行機制不依賴中央銀行、政府、企業的支持或者信用擔保,而是依賴對等網路中種子文件達成的網路協議,去中心化、自我完善的貨幣體制,理論上確保了任何人、機構、或政府都不可能操控比特幣的貨幣總量,或者製造通貨膨脹。它的貨幣總量按照設計預定的速率逐步增加,增加速度逐步放緩,並最終在2140年達到2100萬個的極限。

為什麼要使用比特幣?

全球交易暢通無阻。
比特幣費用低廉。
比特幣易於攜帶,在全球范圍內交易暢通無阻,全世界很多地方都接受比特幣。
去中心化。
比特幣的發行由整個P2P網路完成,不受任何組織和個人控制,是一個完全去中心化的貨幣系統。
比特幣的發行數量是固定的,不會因通脹而貶值,就像黃金一樣。

如何使用比特幣錢包?

我們從三個方面來說明這個問題。

一:什麼是比特幣錢包?

簡單來說,比特幣錢包可以讓你和整個世界進行交易。利用比特幣錢包中生成的比特幣地址你可以接收來自他人的比特幣,你也可以將你帳戶上的比特幣轉到他人的比特幣地址上面。比特幣地址就像銀行卡號一樣,你只有知道別人的比特幣地址才能進行比特幣轉賬。比特幣錢包中保存著你自己的所有比特幣地址和私鑰信息。
二:什麼是比特幣地址和私鑰?

比特幣地址和私鑰是成對出現的,他們的關系就像銀行卡號和密碼。比特幣地址就像銀行卡號一樣用來記錄你在該地址上存有多少比特幣。你可以隨意的生成比特幣地址來存放比特幣。每個比特幣地址在生成時,都會有一個相對應的該地址的私鑰被生成出來。這個私鑰可以證明你對該地址上的比特幣具有所有權。我們可以簡單的把比特幣地址理解成為銀行卡號,該地址的私鑰理解成為所對應銀行卡號的密碼。只有你在知道銀行密碼的情況下才能使用銀行卡號上的錢。所以,在使用比特幣錢包時請保存好你的地址和私鑰。

三:比特幣地址和私鑰的格式

比特幣地址是一段由數學演算法生成的二十七到三十四位長度的字元串,一般以數字「1」或者「3」開頭。每個比特幣地址都對應著一個比特幣私鑰。比特幣私鑰亦是由一串字元組成,一般以數字「5」開頭。私鑰保證了你對該比特幣地址上比特幣的所有權。比特幣私鑰有不同的格式,詳細資料讀者可參見下面的基礎教學內容。

請注意

比特幣的私鑰可以生成該私鑰對應的比特幣地址,但是比特幣地址不能計算出該地址所對應的私鑰。因此,假如你忘記了私鑰而只記得比特幣地址,那麼該地址上的比特幣便不屬於你了。所以,一定要備份好比特幣錢包,保護好私鑰。如何生成比特幣地址和私鑰呢?你可以用比特幣錢包來生成任意數量的地址和私鑰。當然,也有離線生成比特幣地址和私鑰的比特幣錢包工具(關於錢包的概念詳見後面的基礎教學)。
比特幣錢包的種類有哪些?

比特幣常用的錢包有三種:軟體錢包、手機錢包、在線錢包。

軟體錢包:通常指可以在本地機子上運行的比特幣客戶端。使用軟體錢包是最安全的保護你比特幣的方式。
手機錢包:只裝在手機上的比特幣錢包,用手機錢包你可以隨時隨地的使用比特幣。
在線網路錢包:讓你可以在任何地方使用比特幣,在線服務提供商幫助你保護你的比特幣安全。但是值得注意的是,你要仔細謹慎的選擇你的在線錢包提供商。

常用軟體錢包介紹:

①Bitcoin-Qt:
是最早的比特幣客戶端,比特幣初期的骨幹網路就是建立在它上面的。它提供了最高級別的安全性,隱私性和穩定性。然而,它具有的功能並不多。

②Multibit:
是一個輕量級的客戶端。Multibit專注於便捷和易用。它與網路同步是在幾分鍾內就可以使用。Multibit還支持多語言。對於非技術用戶,這是一個不錯的選擇。

③Electrum:
和Multibit類似,Electrum是一款基於SPV原理的比特幣錢包軟體客戶端,它能在幾分鍾之內完成同步。不同的是Electrum採用了和Bitcoin-qt和Multibit不同錢包的找零機制,所有的比特幣私鑰都由安全密碼種子生成,因此他的安全性更高。Electrum適合對比特幣技術原理已經有一定了解的玩家使用。

④Armory:
Armory客戶端是運行於Bitcoin-Qt客戶端之上的高級比特幣客戶端,為高級用戶提供了更多的擴展功能,其中包括了很多關於備份和加密的功能,以及非常安全的線下冷存儲。和Electrum一樣,Armory適合對比特幣有一定了解的用戶使用。

常用的手機錢包介紹:

Bitcoin Wallet:

Bitcoin Wallet可以在Googleandroid商店找到。它是一個輕量級的移動客戶端,支持Android和黑莓系統。這個客戶端並不需要在線才能工作。它支持QR碼(二維碼)掃描和NFC(近距離無線通信)。

常用的在線錢包介紹:

①Blockchain:
Blockchain是最早的比特幣在線錢包提供商,它提供的功能最多,也非常可靠。您可以用它在全球免費付款。它支持在手機上或個電腦上使用。

②P2PBUCKS:
提示:為保證安全,Blockchain.info在線錢包的用戶請使用GoogleAuthenticator或Yubikey等雙因子認證方式登陸。 並定時從Blockchain上下載自己的錢包備份到本地電腦。
我是在 完美生活 衛星號上看到這篇文章哦,詳細的你可以去關注一下:funinusa

閱讀全文

與以太坊如何記錄字元串相關的資料

熱點內容
組織發行虛擬貨幣 瀏覽:178
礦池首頁 瀏覽:993
鼓勵區塊鏈創新 瀏覽:605
虛擬貨幣掛單怎麼老是成交不了 瀏覽:116
區塊鏈應用的音樂平台 瀏覽:952
柱軸力設計值n怎麼算 瀏覽:296
男朋友力氣大算男友力嗎 瀏覽:326
諾華世界區塊鏈 瀏覽:697
中國最專業比特幣交易 瀏覽:512
數字貨幣適合長期投資嗎 瀏覽:821
勒索病毒背後的比特幣暗網疑雲 瀏覽:984
比特幣套取電費 瀏覽:720
北郵區塊鏈實驗室馬 瀏覽:923
銀行虛擬貨幣交易排查報告 瀏覽:705
數字貨幣與經濟法 瀏覽:789
網路上炒虛擬貨幣 瀏覽:106
數字貨幣而何賺錢 瀏覽:836
顯卡的算力和cpu 瀏覽:641
比特幣介紹摘要 瀏覽:235
btm顯卡8btccom 瀏覽:68