『壹』 趁熱再說幾句區塊鏈
趁熱再說幾句區塊鏈
區塊鏈,又火了
互聯網成了維密的 T 台,大佬們穿著技術的內衣褲,搔首弄姿秀性感,腿毛飄飄在風中絲絲縷縷,油黑閃亮。
2017 年末,區塊鏈成了最性感的小內內,各路人馬人手一件,有的穿在襠部,有的頂在頭上,還有的插在桿上當旗幟。
盯著屏幕上的智能合約代碼,我有些憂郁。T 台上沒我,T 台下也沒我,我在暖氣不足的辦公室里,還穿著跟性感毫不沾邊的羽絨服。
今天早上,在小區里遇到牛大媽,她拉住我,語重心長的告誡我,別寫 Java 了,搞區塊鏈吧,概念股都漲瘋了。那是早上 7 點,小區里零下10 度嚴寒逼人,空氣中卻有一種莫名其妙的氣息,聞起來生機勃勃,很可能是天然氣鍋爐排放的廢氣中有某種興奮劑。
我感到無力,感到無奈,這一波的熱度,絕逼又跟我無關了。我那幾行智能合約代碼,對區塊鏈這個2017年的網紅毫無貢獻。 那些 T 台上的大佬們,又一次沒叫我 「同去」,他們一貫如此!
區塊鏈火的莫名其妙,彷彿就在一瞬間,幾個月前的情勢還完全不同。那時候,人工智慧是主角,區塊鏈就像是嫁到山東人家的媳婦,上不得檯面的。有一次在飯桌上,一位 VC 大佬 (不是很大,半大不大)介紹自己的投資方向:「必須是人工智慧,區塊鏈不行的。」 他眼睛盯著我,炯炯有神。 我低下頭,有些羞愧。這要是在微博上,我就死掐了,你可以看不起我這個人,但你不能看不起我用的技術,對不對?
然而,就在最近,這位大佬(不是很大,半大不大)開始轉徐小平,馬化騰關於區塊鏈的文章了,而且評論道:「深刻好文!改變世界的區塊鏈!」。不知道這位大佬(不是很大,半大不大)是否也要掀區塊鏈的牌子了。
我一直疑心,有一個神秘的 「互聯網名詞炒作委員會」,就是他們在翻雲覆雨興風作浪,一波波的炒作各種概念......而我見到的那 VC 大佬(不是很大,半大不大),很可能不在這個委員會中。
人工智慧 VS 區塊鏈,該誰吃雞?
人工智慧與區塊鏈,可謂是絕代雙驕,成了近年來最火熱的兩個概念。
如果硬要比一下的話,人工智慧與區塊鏈,誰更牛逼?
談起人工智慧,人類就要發抖,說是害怕有一天被機器收拾了。這有點像家養的寵物狗,看到只斷翅的蒼蠅,就如臨大敵,張牙舞爪上躥下跳的汪汪叫,其實就是平時太無聊,找個機會自己嚇自己玩。人工智慧也好,機器人也好,別說收拾人類了,就是收拾只蒼蠅,都還早著呢,往一百年外展望吧。我覺得,我國的 GDP 銀河系第一,都會比人工智慧擁有自我意識來的早。
而談起區塊鏈,那發抖的是各個中心化的權力機構,其中就要包括各國政府啦。這可真不是小狗抓蒼蠅的游戲,想想吧,現在就有多少財富藏在了比特幣鏈條上,而各國政府無能為力,束手無策,一籌莫展,恨之入骨。蒼蠅也是肉,眼看著蒼蠅越來越肥,小狗們抓不到,著急死了。
所以說啊,從長遠來看,人工智慧一定是牛逼多了。未來科技的接力棒,是要從人類的手上交給 AI 的,這還不夠 AI 臭屁的?
但從近期看,區塊鏈的意義卻更加重大,因為,它改變的目標,乃是人類的組織模式。
區塊鏈消解中心化的權力;區塊鏈建立信任的網路;區塊鏈用代碼傳遞價值;區塊鏈協調機器間的對話;區塊鏈實現社區自治。從來就沒有什麼救世主,也沒有神仙皇帝 - 這句歌詞完全可以送給區塊鏈。過去千百年來,社會的運轉全賴中心化威權機構的安排,而今,終於有一絲曙光出現在技術的地平線......
管它什麼東西,到我中華民族眼裡,第一個問題是:這東西能不能吃?第二個問題是:這玩意能不能掙錢。
區塊鏈自然不能吃,這個不用我回答了,問問你身邊的廣東朋友吧。要問人工智慧與區塊鏈,哪個在掙錢這件事上更牛逼,我還真回答不上來,廣東人也一樣不知道。這個問題該問那位 VC 大佬(不是很大,半大不大)。
中本聰當年搞 「一種點對點的電子現金系統」,真不是為的錢。 密碼朋克小組里的那些大佬(真的很大,大無可大)哥們,都是貨真價實的反賊,他們就是要跟政府對著干! 追求的那是個自由的感覺。 早到從 RSA 那三個哥們開始,只要是搞密碼學的,又不是美國政府體制內的,哪一個不是美國政府的眼中釘肉中刺?這還說的是美國政府,換個別的政府,噢,天哪,血都涼了,墳頭草都亭亭如蓋了。
還有另一波大佬(真的很大,大無可大)哥們,他們是米塞斯、哈耶克一夥,對各國政府深懷敵意的一群經濟學者。哈耶克認為,貨幣的發行權就不該壟斷在政府手裡,政府根本沒有能力掌控貨幣的發行,貨幣的發行應該交給自由市場。讓政府發行貨幣,就如同讓老鼠去烹飪美食,首先老鼠就壓根做不到烹飪,其次老鼠會偷吃原材料。 哈耶克說:任何人都可以發行貨幣,應該讓多種貨幣在市場中自由競爭。
哈耶克一貫的核心思想就是:從來就沒有什麼救世主,也沒有神仙皇帝,能夠制定和控制經濟運行的規則,這些規則是在自由市場中無意識的演化出來的。
交給自由市場吧,有些事情是人類理解不了的,也操作不好的。
哈耶克的核心思想,也是人工智慧的核心思想,也是區塊鏈的核心思想。為什麼這么巧合呢?因為啊,牛逼的人想法都是相同的,而不牛逼的人各有各的想法。
人工智慧說,這個函數太復雜,人類找不出來的,讓機器找出很多個線性函數來擬合它吧,交給機器吧。
區塊鏈說,信任這種事,交給人類真的不放心,還是讓機器來執行約定好的規則吧。
把權力交給機器,是人工智慧與區塊鏈共同的哲學思想。
說到這里,我們可以犀利睿智的指出,其實人工智慧和區塊鏈乾的是一件事嘛。 區塊鏈從組織形式上,為機器開道。人工智慧則從能力上,為機器開道。人類的組織形式和能力,都太過老舊了,該為將來的機器文明做一些變革了。
對於開發者來說,區塊鏈要更容易上手一些。人工智慧太麻煩了,又要數據又要顯卡,還要建模調參看效果。所以,窮屌絲程序員,要掙小錢,就搞區塊鏈吧。懷揣夢想,渴望掙大錢的程序員,請走右邊,右邊是人工智慧通道,請閉上眼睛,齊步走,一二三,跳!
區塊鏈,能幹些什麼?
在現階段,用區塊鏈干什麼最合適? 我的答案是營銷!換句話來表達,就是用來忽悠,最合適不過。
據說,現在全國有 5000 家公司與區塊鏈有關系。又據說,全國能開發區塊鏈的開發者,一共 200 人。
我覺得這兩個數字都不很靠譜。我認為,靠譜的說法是,全國共有 5000 家公司的老總,在朋友圈裡瀏覽過區塊鏈的科普文章,於是他們的公司就都與區塊鏈沾邊了。 至於開發者,能跑起來 Hyperledger,Ethereum,能寫幾行智能合約,全國怎麼也得有個 5000 人。
還據說,這個說法我認為較為靠譜,那就是在 2017 年,區塊鏈技術帶來的收入,不超過 1 億人民幣。
所以說,現在那些鋪天蓋地的宣傳,大家聽聽就好了,不必太當真。在這個階段,這種宣傳倒也不是壞事,也算是推動行業發展了。四人抬轎,千人吆喝,總能快一點點,啦啦隊也不是沒有貢獻。
而且,區塊鏈的發展,也確實被推動了。我已經被 50000 個人問過:我能用區塊鏈做些什麼?
被忽悠一番後,大家都開始盯著自己家那些中心化系統了,懷疑的波光在眼神中流轉。就像新一季開始,女人審視自己的衣櫃一樣。
其實呢,大家完全不必喜新厭舊。 區塊鏈要幹掉的,是中心化的 「組織」,不是要幹掉中心化的 「系統」。你那 OA 該怎麼用還怎麼用吧,自家的 OA 系統,沒必要搞區塊鏈。就跟你一家族企業,要投票選舉董事長了,你這不是腦子進水么。
要用區塊鏈,您先想一想,您是要與誰,在哪個業務上,去達成 「共識」? 您是要與誰,在哪個環節,去取得 「互信」?
核心是 「共識」。
當然,區塊鏈還能做到永不停機,這是以太坊大肆宣揚的。但在我看來,這真沒那麼重要。中心化的系統做好了,離永不停機也差不多。
舉個區塊鏈應用的例子。常見且便於理解的例子,是簽合同的場景。我們現在簽訂合同,依然依賴的紙質合同。在紙質合同上簽字蓋章,然後一式兩份,雙方各持一份。這是發生在現實世界中,一次 「共識」 的達成。
「紙質」 與 「簽字蓋章」,這就是為了防篡改。而 「一式兩份」,就是分布式存儲。
要把簽紙質合同這個過程,用軟體來完美的實現,那就是區塊鏈了。「紙質簽字蓋章」 在區塊鏈上的實現,是通過時間戳、哈希運算、非對稱加密簽名等技術。 而 「分布式存儲」,則是通過 POW,POS 共識演算法以及 P2P 協議完成。
以上全過程的軟體實現,就是一次區塊鏈 「共識」 的達成。
IT 技術、互聯網技術發展到今天,現金都被電子支付取代了,而合同卻一直是個老大難,紙質合同流程一直頑固的存在著。現在,區塊鏈就是來顛覆紙質合同這樣頑固場景的。
再舉個例子吧。 積分互通的場景。不知道為什麼,2017 年末,做積分突然火起來了,家家戶戶都要做積分。我私下猜測,怕是有些楚王好細腰的意思,楚王的聖意被 「 「互聯網名詞炒作委員會」 破解了。早年間咱們的 「工分」 不就是一種積分么。
當然,商業積分在很多國家是非常成熟的,對於企業來說,積分是很好的客戶忠誠度管理工具,但在我國一直沒有做起來,所以,發展一下商業積分,是個好方向。
例子是這樣的。兩家企業,A 與 B,都發行了自己的積分,叫 A 積分與 B 積分吧。 兩家企業想搞積分共用,讓消費者可以在 B 那裡用 A 的積分,在 A 那裡用 B 的積分。
這就產生了一個場景,消費者燈下鼠到了企業 B,用 A 積分 100 萬買了台保時捷,若是在傳統的中心化系統下,企業 B 的系統要通過 API 連接到 A 的系統,驗證燈下鼠的身份,以及積分數量。驗證後,請求 A 的系統,要消費 100 萬 A 積分,經 A 的同意,A 的系統記錄 B 消費了 100 萬積分。B 在自己的資料庫中記錄,收到 A 積分 100 萬。
到了月底,B 拿著 100 萬積分的報表,到 A 那裡去結賬。A 到資料庫中查詢,確認有 100 萬積分到了 B 那裡。OK,結算成功。
問題是,A 若是不承認 100 萬積分怎麼辦? 抵賴怎麼辦?A 若是改自己的資料庫怎麼辦?若是再復雜一些, 多家企業參與, B 收到 A 的積分,還可以到 C 那裡去消費 A 的積分,這該怎麼處理?
區塊鏈就能完美的解決這個問題。A B 兩家企業,通過聯盟鏈,把積分交易近乎實時的達成共識。也不用月底再走對賬手續了,任何時候,A B 兩者的區塊鏈數據都是一致的。
有的開發者要鑽牛角尖了:我用傳統的中心化系統,一樣能保證資料庫一致。
當然是可以的。但只要你做的完美,讓 A B 兩家的資料庫能夠完全一致,解決了各種可能出現的問題,那麼實際上,你就是在開發一套區塊鏈了。
在多方之間,達成 「信任」,達成 「共識」,就是區塊鏈的用武之地。
中本聰設計比特幣,完全是為了設計一種去中心化的電子貨幣。由此,誕生了區塊鏈。
而到了以太坊,則區塊鏈搖身一變成了 IT 基礎設施。以太幣乃是驅動區塊鏈應用的價值度量,而以太坊上的智能合約,才是鏈條的主角。
理論上,智能合約能開發任何系統。智能合約英文是 Smart Contract,這里的 「智能」,與 AI 的 Artificial Intelligence 的智能沒關系。實際上,尼克薩博在 95 年提出智能合約時,也與區塊鏈也沒關系,它的概念很簡單,就是將法律條文寫成可執行代碼。
但巧克力與下雨天最配,智能合約與區塊鏈最配。 如上文所述,合同,都是要一式兩份,或者一式四份的。 而智能合約,既然是法律條文,又要可自動執行,當然不能控制在合同的某一方手中,一定是要實現分布式存儲,才能令參與各方放心,這就是所謂的去中心化了。
今天,用區塊鏈,用智能合約來做的應用,主要集中在如下幾個領域:
金融領域:用來做數字貨幣;用來做支付系統;用來做匯款系統;用來做清算系統;用來做證券交易系統;用來做供應鏈金融。
資產描述:用來做資產的登記,例如房產土地注冊,貴重物品登記。
保險產品:用來做互助保險,以及其它條款簡單的保險產品。
身份認證:用來做個人以及企業的身份信息存儲以及在線認證。
供應鏈:用來做商品的溯源,生產流程的跟蹤。
政務:用來做投票;用來做公文存證;用來做產權登記。
當然還可以用來做游戲,比如做一個區塊鏈養貓,養狗,養青蛙,或者也可以試試養漢子?
甭管做什麼了,在您決定要進軍區塊鏈之前,在您決定開始搜索 「區塊鏈」 之前,記住我的話,一定要先宣傳,要用能讓全世界都聽到的嘹亮聲音呼喊:我們做區塊鏈了。
區塊鏈技術的現狀
能幹什麼,與乾的怎麼樣,是兩件事。
區塊鏈最成熟的應用,自然還是比特幣、以太坊等系統。而在商業應用領域,只能說大家都還在摸索。
很多報道說xx公司區塊鏈應用上線了,其實多數都是在自己家裡,或者幾家公司聯盟,在各自的實驗室里跑了條鏈而已。還沒見到哪個應用,把鏈條數據直接放出來的。
現階段,智能合約的應用,也是與中心化的系統結合使用。少有把所有的業務邏輯,都在智能合約上實現。
把區塊鏈用的純熟的,多數都是創業型公司。能自己寫一條鏈條的人,大約是不屑於打工了。
大規模、大容量的應用,例如電商什麼的,幾乎沒有用區塊鏈實現的。畢竟現階段,區塊鏈還有效率和容量的問題。 但我想,真的實現,也不會太久了。現在雖然還是 「只聽樓梯響,不見人下來」,但一旦下來一個人,跟風者馬上就會擠滿房間的。
不用 10 年,區塊鏈就會成為一種常用的技術,就和今天的關系型資料庫一樣。
但區塊鏈註定有別於關系型資料庫,有別於移動、大數據技術什麼的,它是與互聯網一個級別,甚至超越互聯網的概念。因為,它挑戰了人類的組織模式,它改變了人類的組織模式。
今天的互聯網如此繁榮,如此劇烈的改變人類的生活,但它並沒有改變人類的組織模式。電商是非常發達了,但只不過把市場從社區商店超市搬到了淘寶和亞馬遜。銀行還是那個銀行,支付寶微信也不過是另一個銀行;中介還是中介,淘寶店不過是商店的網上形態;你要證明自己是父母的蛾子,還是要去派出所蓋個章,一切都沒有變化,和明清時代也少有不同。以 「人」 為中心,來執行判斷,來做決策,幾千年來毫無變化。
是時候,將一部分工作,交給機器了。
當區塊鏈技術發展 50 年後,人們回首望去,驚訝的發現,有那麼多的機構竟然消失不見,才能領會到 2107 年區塊鏈所生發出的意義。
10 年之後,區塊鏈技術在開發中,將要佔據十分之一的工作量。這是我估計的,不一定準,先瞎猜一個,萬一準了呢。
上文說的,智能合約與區塊鏈最配,智能合約彷彿俠客,而區塊鏈則是一匹駿馬。
區塊鏈還有一個絕配,那就是物聯網。萬物互聯,物與物之間的對話,物與物之間的交易,該怎麼搞? 用區塊鏈的去中心化存儲,用區塊鏈的共識演算法,再合適不過。不過,那還遠,區塊鏈結合上物聯網的時候,我國 GDP 肯定早已太陽系第一了。
我該怎麼應用區塊鏈
前文已敘,使用區塊鏈的第一件事,是要大聲喧嘩,要讓全世界都知道你用區塊鏈了,一方面給自己做做營銷,另一方面順便推動行業發展。
第二件事,是審視下自己的業務,有那些地方,需要與他人達成共識,需要與他人達成互信,找到了,就是你用區塊鏈的地方。
但切切記住,在今天應用區塊鏈,一定要謹慎,這與用關系型資料庫和JAVA 開發系統還是很不一樣的。
一定要認真的分析,認真的設計,然後再動手。用哪個開源區塊鏈,是公鏈部署還是私鏈部署,智能合約如何設計,與中心化系統的介面怎麼搞,上線後怎麼運行,怎麼維護,這些都要仔細考慮。
其實能選擇的技術路線,就那麼幾種,比特幣,以太坊,Hyperledger,Quorum,可選的不多。
找國內的區塊鏈公司,直接用他們的鏈條也可以,有些公司的鏈也很可靠了。趣鏈、布比好多家都是認真做鏈的。不過,就我所知,國內的鏈,也都是從那幾條國際鏈改過來的。
要是自己搞,就找兩個研究能力強的工程師,從頭開始學習以太坊或者 Hyperledger,大約過二三個月,應該就能寫智能合約了,也能做 Dapp 了,要是還不能,你就開掉他們吧,重新招兩個。要是野心大的,想要自己改鏈條協議,從源碼玩起,這個難度要大些,你得找幾個數學好,精通演算法的博士,認真干個一兩年吧。其實,改鏈條源碼,也是個良心活,改多改少,只要不放出去,也只有你自己知道。
動手之前,最好還是找一些做過區塊鏈項目的,咨詢一下。可能人家的一句話,就省卻你 3 個月的功夫。 要知道,在浩瀚的互聯網上,還真找不到區塊鏈的成熟應用方案,大家都在摸索。
最大的挑戰就是:我的應用場景,該如何用區塊鏈技術來實現。
大家都在黑暗中摸索,摸到成功的,就是開了一盞燈,等到千百盞燈亮起,房間里燈火通明的時候,區塊鏈技術也就不稀罕了。
怕的是摸了一通,黑燈瞎火,光摸到飄飄的腿毛,摸不到燈,大家就灰心喪氣,就散了,不摸了。人工智慧就散了好幾次,這幾年又重振信心,繼續摸開了,大佬們的腿毛再次在黑暗中油光發亮。
用了區塊鏈,我能得到什麼
對於工程師來說,掌握了區塊鏈技術,當然薪資要漲一把了。今天區塊鏈人才還是很稀缺的。
對於一家企業來說,若是用上了區塊鏈,千萬別看著區塊刷刷挖出來,自己個兒偷著樂,一定要大肆宣傳,品牌會提升,銷售會增加,股價市值會暴漲。
說到底呢,股價和市值,跟區塊鏈技術沒多大關系,漲了也是因為忽悠的技術好。那些大佬們,也就是 「互聯網名詞炒作委員會」 的委員們,人家不炒區塊鏈,也會去炒 AI,不炒 AI 也會去炒 iOT,總之,人家的炒鍋里不會缺料的。怎麼忽悠,怎麼來錢,刷刷的從天上掉錢。
真喜歡區塊鏈技術,又在 「互聯網名詞炒作委員會」 里沒有乾爹的,就別想那麼多了,屌絲戒之在貪。 別想錢的事了,先用上再說,得不到什麼便宜,也能嘗個鮮不是。
2013 年的時候,在望京的一間狹小辦公室中,我與幾個朋友聊天,談起用 Java FX 做一個比特幣交易網站。一位朋友說:「比特幣現在漲瘋了, 200 多塊錢一個,做個交易所不錯的。」
我那個時候就喜歡比特幣,因為比特幣那反賊氣質,但我沒有買。交易所也沒做。
現在我後悔了,但卻不僅僅因為錯過了比特幣高漲的盈利機會。而是我反思得出了一個結論,那就是,雖然我口口聲聲熱愛自由,實在只是葉公好龍罷了,當一個自由的烏托邦擺在我的面前,我卻沒有珍惜,不敢走進去。我沒買比特幣,就是個好的例證。
『貳』 【深度知識】以太坊數據序列化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 )
『叄』 以太坊交易(tx) 分析
更多請參考: Github: https://github.com/xianfeng92/ethereum-code-analysis
其中 object 和 opcodes 是相對應的,比如 60 對應就是 operation PUSH1,合約編譯後的位元組碼即為一組的 operation 。
合約部署其實就是實例化一個 contract 對象,並將 data 的值設給 Code屬性 。
創建合約的tx中,input欄位對應的是合約的位元組碼,即指令數組。
其中 input 欄位對應所要調用的函數簽名的前四個位元組(771602f7)以及對應的參數(1,2)
其中 input 欄位為所要調用的合約函數簽名的前四個位元組(72a099b7)
關於函數調用,Call會把對應的Code讀出來,依次解析,Code中會把所有的public簽名的函數標志(4位元組)push到棧里。然後依據 input 中需要調用函數的簽名標志(前4位元組)來匹配 Code, 匹配之後跳轉到對應的 opcode 。
『肆』 美國上市公司由第三方審計作為公司狀況的顧問是否具有可借鑒性
第三方審計 工作是由具備資質的會計師所進行審計,那麼所謂的第三方,就是中立的一方,注冊會計師正好具備這個特點。因為 第三方具有中立的特點 ,所以在對上市公司做審計工作的同時可以做到公平、公正、公開,不偏袒任何方面。可以最大程度的做到就事論事,以提高投資者對審計報告的認可度。
對於美國上市公司來說, 有效的財務會計報告內部控制對公司管理及其事務,盡到對其投資者的責任,有至關重要的作用。 公司管理當局、公司所有者、投資公眾和其他相關方都需依賴公司承保的財務信息來制定決策。那麼需要做到這些,自己來審計自己,顯然是做不到足夠的公平公正與公開,也不可能得到各方面的對報告的認可。 所以把這些交給具有中立性的第三方來做是最合適的事情。
那麼 審計的獨立性 ,就是說注冊會計師不受那些削弱或總是有合理的估計,仍會削弱注冊會計師做出無偏審計決策能力的壓力及其他因素的影響。這對審計工作來說,至關重要,因為涉及到市場經濟的,利益公平,獨立性。這個獨立性,也應當保持形式上的獨立和實質上的獨立,也就是說注冊會計師與被審計單位或個人沒有任何直接或間接的利益關系。不受到個人或外界因素的約束,影響和干擾,保持客觀且無私的精神及工作態度。
而第三方審計,在我國也是非常有必要的。我們不僅是借鑒,而且也正在使用第三方審計的工作。而且 我國有明確的法律規定,上市公司的年度報告必須要經過第三方的審計。 這么做也是為了能夠讓上市公司的審計報告能夠更加的客觀,公平,公正,公開,做到不摻雜任何利益關系和個人 情感 關系。
全球第三大審計機構certik為眾多知名項目保駕護航
據統計,2018年全球區塊鏈130領域93706165發生近百起安全事件,損失超20億美元,相較於2017年增長了538%。比特幣的底層技術「區塊鏈」面臨著來自數據層、網路層、共識層、激勵層、合約層、應用層的安全風險,安全攻擊方式層出不窮,防不勝防。安全攻擊主要發生在應用層,其中智能合約是區塊鏈安全的重災區。
而且還發生了很多的安全事件,影響較大的例如MtGox事件,MtGox是當時全球最大比特幣交易平台,處理的比特幣交易佔全球70%。2014年,MtGox遭遇了最嚴重的黑客攻擊,隨後MtGox宣布暫停交易,理由是其安全軟體存在漏洞。兩周後,網站突然關閉,MtGox申請破產。
據MtGox估計,公司的比特幣投資損失約合4.8億美元,其中包括客戶的75萬單位比特幣和公司自己持有的10萬單位,合計約佔全球比特幣發行量的7%。此次事件導致投資者信心受挫,比特幣直接暴跌36%。
還有非常多別的項目同樣受到巨大的損失,仔細研究不難發現:在區塊鏈的安全事件中,大多都是由於源代碼存在漏洞而使黑客趁虛而入。智能合約受到區塊鏈本身保護,所以智能合約代碼可以最大限度的開源和讓人閱讀。但是代碼的公開性使得黑客容易掌握代碼的缺陷,進一步利用代碼缺陷觸發條件改變智能合約執行結果,使得區塊鏈項目存在巨大的經濟隱患。所以智能合約代碼的開源性需要代碼的高可靠性,這種可靠性要求100%的正確。
但是,對於程序員來說,寫一個完全沒有漏洞的代碼實在是太難了,即使採取了所有可能的預防措施,在復雜的軟體中也總會出現沒有預料到的漏洞。所以,代碼審計的重要性不言而喻。
通過代碼審計,檢查源代碼中的安全缺陷,檢查程序源代碼是否存在安全隱患,或者有編碼不規范的地方,通過自動化工具或者人工審查的方式,對程序源代碼逐條進行檢查和分析,發現這些源代碼缺陷引發的安全漏洞,並提供代碼修訂措施和建議。
目前已經服務的有交易所、錢包、公鏈和智能合約等代碼審計,為區塊鏈行業保駕護航,合作的慢霧 科技 ,Certik等全球知名審計公司,我們有著優質的服務滿足客戶的需求,歡迎合作夥伴合作交流,共同探討!
發生過的案例:
一、區塊鏈代碼審計可以解決哪些問題:讓黑客無孔可入
隨著BTC、ETH、EOS等區塊鏈項目的迅速發展,區塊鏈項目已經進入了智能合約時代,但是智能合約自身的正確性和安全性卻面臨著巨大的問題。
也就是說任何一個項目在使用區塊鏈時都有可能走向歧途,不能完全保證代碼的准確性。就像每個人在電腦打字時都會打錯字一樣,程序員在輸入代碼時也會存在筆誤和錯漏。
而區塊鏈中的基礎:智能合約代碼的開源性需要代碼的高可靠性,這種可靠性要求100%的正確。
差之毫釐,謬以千里。
用專業的術語來說:
類似比特幣這樣的代碼全部公開,用智能合約代碼存儲在區塊鏈上,與交易數據一樣受到區塊鏈的加密保護,要想修改智能合約代碼需要掌握51%的算力,因此,智能合約代碼的防篡改性得到大大提升。
智能合約受到區塊鏈本身保護,所以智能合約代碼可以最大限度的開源和讓人閱讀。智能合約解決了可以公開代碼並保障其安全的問題,但是代碼的公開性使得黑客容易掌握代碼的缺陷,進一步利用代碼缺陷觸發條件改變智能合約執行結果,使得區塊鏈項目存在巨大的經濟隱患。
就像,我們在銀行里轉賬,每一個賬戶的信息都是對的,轉賬才能夠是正確的,你的財產才可以安全被保護,所以:區塊鏈代碼中一個字都不能錯。
二、區塊鏈代碼錯誤導致的嚴重後果
區塊鏈中的智能合約代碼質量不好造成了許多嚴重的後果。
目前來看,許多交易所和代幣項目在上交易所之前沒有經過區塊鏈代碼審計,造成了許多虛擬貨幣被盜竊的黑客事件。
1、SMT項目方與美國BEC代幣的安全漏洞
2018年4月25日凌晨,SmartMesh(SMT)項目方反饋發現其交易存在異常問題,經初步排查,SMT的以太坊智能合約存在漏洞。受此影響,火幣Pro目前暫停所有幣種的充提幣業務。
另據媒體報道,發現SMT與美圖BEC代幣存類似的安全漏洞,即可通過溢出攻擊可以收到大量的代幣。
2、美圖BEC的異常交易漏洞
2018年4月22日,美圖BEC出現異常交易,據分析,BEC 智能合約中的batchTransfer批量轉賬函數存在漏洞,攻擊者可傳入很大的value數值,使cnt * value後超過unit256的最大值使其溢出導致amount變為0。
3、Parity多簽名錢包漏洞
2017年7月,Parity多簽名錢包由於其智能合約代碼中存在漏洞,被黑客盜取時價超過3000萬美金的ETH。
4、黑客盜幣漏洞
2016年6月由於智能合約的一個錯誤,黑客從DAO偷走了價值5500萬美元的ETH。
代碼的安全缺陷倒逼智能合約的代碼自動審計。
三、區塊鏈代碼審計成就完美合約
區塊鏈智能合約通過代碼建立一套「法律合同」,軟體工程師創造一個完全無誤差的代碼是不可能的,程序員總存在疏忽的地方。紅岸 科技 和國防 科技 大學的Ulord區塊鏈項目研究團隊對市面上的區塊鏈智能合約進行了審計,他們的研究發現:
對所有的程序員來說,寫一個沒有bug的代碼實在是太難了,即使採取了所有可能的預防措施,在復雜的軟體中也總會出現沒有預料到的執行路徑或可能的漏洞。
這是為什麼要代碼審計最重要的原因之一。
區塊鏈中的 「法律合同」是一項受解釋和仲裁的約束,程序員很難去創造一個縝密的合約。在任意一個大的合約里,可能出現的文稿錯誤以及一些條款需要解釋和仲裁。
同時,軟體工程師不是法律專家,反之亦然。起草一份好的合約需要各種各樣的技能,不一定與編寫的計算機程序兼容。
因此,智能合約代碼在一定程度上都可能存在安全隱患。傳統的智能合約代碼審計主要利用人工,依靠code reviewer閱讀智能合約代碼。人工代碼審計最終還是依賴人的經驗,代碼審計效果不明顯,針對目前ETH大量代幣的智能合約,人工審計工作量大,難以高效的完成工作。
在區塊鏈領域從事代碼審計業務的項目公司較少,目前每個代幣在上交易所之前,其區塊鏈智能合約代碼由交易所進行審察和判定,但交易所有時並不能完全有效地判斷合約是否完美。
智能化代碼審計,利用計算機進行穩健性檢驗是當前代碼審計最重要的方式,掌握該項技術標準的國內公司並不多。
但,區塊鏈代碼審計的重要性不言而喻,區塊鏈世界本身是相當安全的,但是由於人為撰寫代碼的問題,不可能完美,必須加強代碼有效性的識別。
『伍』 區塊鏈前景如何
2018年,區塊鏈接棒AI成為最熱門的技術名詞,已經有越來越多的科技公司宣布進軍區塊鏈市場,互聯網中,迅雷、人人、暴風、天涯等公司都有區塊鏈相關動作。這些公司有著相同的命運,他們都曾經歷過風光,但經過互聯網創業大潮的沖擊,開始走下坡路,而後蹭上區塊鏈的熱點,開始嘗試逆襲。
全球區塊鏈產業投資火熱
據前瞻產業研究院發布的《區塊鏈行業商業模式創新與投資機會深度分析報告》數據顯示,截至2017年4月底,全球共計455家區塊鏈公司,累計獲得融資額19.47
億美元。其中美國區塊鏈相關公司獲投融資總額高達12.52億美元,占據全球市場的64.3%;中國區塊鏈新興企業融資總額約為1.14億美元,佔比達到5.86%,僅次於美國位列世界第二且增速迅猛。
目前區塊鏈的整體生存現狀良好,存活率87.25%。所有的獲投公司中有47
家已經關閉,約佔10.51%,另10家公司被收購。由於比特幣市場競爭格局改變,部分公司被迫關停,同時部分幣圈公司也逐漸向鏈圈公司轉型
國家層面的探索也已經開始。3月23日,工信部信息化和軟體服務業司發布消息稱,將研究探索區塊鏈在工業領域的應用。此前,工信部表示,正在籌建全國區塊鏈和分布式記賬技術標准化技術委員會,探索形成完備的區塊鏈標准體系,更好地服務區塊鏈技術產業發展。
『陸』 區塊鏈是什麼,怎麼用區塊鏈賺錢
區塊鏈是一個信息技術領域的術語。從本質上講,它是一個共享資料庫,存儲於其中的數據或信息,具有「不可偽造」「全程留痕」「可以追溯」「公開透明」「集體維護」等特徵。基於這些特徵,區塊鏈技術奠定了堅實的「信任」基礎,創造了可靠的「合作」機制,具有廣闊的運用前景。
區塊鏈賺錢的方法如下:
1、炒幣,炒幣就像炒股,炒幣是區塊鏈賺錢門檻最低的一種方式;
2、商販,區塊鏈是全球性的市場,可以像小商販一樣,從價格低的平台搬到價格高的平台去賣,賺差價;
3、推廣賺傭金,區塊鏈的做法是,首先注冊交易所賬號,生成自己的邀請鏈接,然後推廣,有人通過你的鏈接注冊了交易所並產生交易的話,即可獲得傭金;
4、挖礦,比特幣中的「挖礦」就是記賬的過程;
5、技術支持,給一些團隊和企業提供區塊鏈技術支持;
6、開交易網站,收取手續費;
7、開發錢包,錢包是區塊鏈的基礎設施,就像區塊鏈的「支付寶」或「微信支付」;
8、做區塊鏈項目或基礎設備供應商。
溫馨提示:以上解釋僅供參考,不作任何建議。入市有風險,投資需謹慎。您在做任何投資之前,應確保自己完全明白該產品的投資性質和所涉及的風險,詳細了解和謹慎評估產品後,再自身判斷是否參與交易。
應答時間:2020-12-02,最新業務變化請以平安銀行官網公布為准。
[平安銀行我知道]想要知道更多?快來看「平安銀行我知道」吧~
https://b.pingan.com.cn/paim/iknow/index.html
『柒』 ethtool原理介紹和解決網卡丟包排查思路
之前記錄過處理因為LVS網卡流量負載過高導致軟中斷發生丟包的問題, RPS和RFS網卡多隊列性能調優實踐 ,對一般人來說壓力不大的情況下其實碰見的概率並不高。這次想分享的話題是比較常見伺服器網卡丟包現象排查思路,如果你是想了解點對點的丟包解決思路涉及面可能就比較廣,不妨先參考之前的文章 如何使用MTR診斷網路問題 ,對於Linux常用的網卡丟包分析工具自然是ethtool。
2020年06月22日 - 初稿
閱讀原文 - https://wsgzao.github.io/post/ethtool/
ethtool - utility for controlling network drivers and hardware
ethtool is the standard Linux utility for controlling network drivers and hardware, particularly for wired Ethernet devices. It can be used to:
Most features are dependent on support in the specific driver. See the manual page for full information.
ethtool 用於查看和修改網路設備(尤其是有線乙太網設備)的驅動參數和硬體設置。你可以根據需要更改乙太網卡的參數,包括自動協商、速度、雙工和區域網喚醒等參數。通過對乙太網卡的配置,你的計算機可以通過網路有效地進行通信。該工具提供了許多關於接駁到你的 Linux 系統的乙太網設備的信息。
接收數據包是一個復雜的過程,涉及很多底層的技術細節,但大致需要以下幾個步驟:
NIC 在接收到數據包之後,首先需要將數據同步到內核中,這中間的橋梁是 rx ring buffer 。它是由 NIC 和驅動程序共享的一片區域,事實上, rx ring buffer 存儲的並不是實際的 packet 數據,而是一個描述符,這個描述符指向了它真正的存儲地址,具體流程如下:
當驅動處理速度跟不上網卡收包速度時,驅動來不及分配緩沖區,NIC 接收到的數據包無法及時寫到 sk_buffer ,就會產生堆積,當 NIC 內部緩沖區寫滿後,就會丟棄部分數據,引起丟包。這部分丟包為 rx_fifo_errors ,在 /proc/net/dev 中體現為 fifo 欄位增長,在 ifconfig 中體現為 overruns 指標增長。
這個時候,數據包已經被轉移到了 sk_buffer 中。前文提到,這是驅動程序在內存中分配的一片緩沖區,並且是通過 DMA 寫入的,這種方式不依賴 CPU 直接將數據寫到了內存中,意味著對內核來說,其實並不知道已經有新數據到了內存中。那麼如何讓內核知道有新數據進來了呢?答案就是中斷,通過中斷告訴內核有新數據進來了,並需要進行後續處理。
提到中斷,就涉及到硬中斷和軟中斷,首先需要簡單了解一下它們的區別:
當 NIC 把數據包通過 DMA 復制到內核緩沖區 sk_buffer 後,NIC 立即發起一個硬體中斷。CPU 接收後,首先進入上半部分,網卡中斷對應的中斷處理程序是網卡驅動程序的一部分,之後由它發起軟中斷,進入下半部分,開始消費 sk_buffer 中的數據,交給內核協議棧處理。
通過中斷,能夠快速及時地響應網卡數據請求,但如果數據量大,那麼會產生大量中斷請求,CPU 大部分時間都忙於處理中斷,效率很低。為了解決這個問題,現在的內核及驅動都採用一種叫 NAPI(new API)的方式進行數據處理,其原理可以簡單理解為 中斷 + 輪詢,在數據量大時,一次中斷後通過輪詢接收一定數量包再返回,避免產生多次中斷。
(1) RX errors
表示總的收包的錯誤數量,這包括 too-long-frames 錯誤,Ring Buffer 溢出錯誤,crc 校驗錯誤,幀同步錯誤,fifo overruns 以及 missed pkg 等等。
(2) RX dropped
表示數據包已經進入了 Ring Buffer,但是由於內存不夠等系統原因,導致在拷貝到內存的過程中被丟棄。
(3) RX overruns
表示了 fifo 的 overruns,這是由於 Ring Buffer(aka Driver Queue) 傳輸的 IO 大於 kernel 能夠處理的 IO 導致的,而 Ring Buffer 則是指在發起 IRQ 請求之前的那塊 buffer。很明顯,overruns 的增大意味著數據包沒到 Ring Buffer 就被網卡物理層給丟棄了,而 CPU 無法即使的處理中斷是造成 Ring Buffer 滿的原因之一,上面那台有問題的機器就是因為 interruprs 分布的不均勻(都壓在 core0),沒有做 affinity 而造成的丟包。
(4) RX frame
表示 misaligned 的 frames。
網線上的packet首先被網卡獲取,網卡會檢查packet的CRC校驗,保證完整性,然後將packet頭去掉,得到frame。網卡會檢查MAC包內的目的MAC地址,如果和本網卡的MAC地址不一樣則丟棄(混雜模式除外)。
網卡將frame拷貝到網卡內部的FIFO緩沖區,觸發硬體中斷。(如有ring buffer的網卡,好像frame可以先存在ring buffer里再觸發軟體中斷(下篇文章將詳細解釋Linux中frame的走向),ring buffer是網卡和驅動程序共享,是設備里的內存,但是對操作系統是可見的,因為看到linux內核源碼里網卡驅動程序是使用kcalloc來分配的空間,所以ring buffer一般都有上限,另外這個ring buffer size,表示的應該是能存儲的frame的個數,而不是位元組大小。另外有些系統的 ethtool 命令 並不能改變ring parameters來設置ring buffer的大小,暫時不知道為什麼,可能是驅動不支持。)
網卡驅動程序通過硬中斷處理函數,構建sk_buff,把frame從網卡FIFO拷貝到內存skb中,接下來交給內核處理。(支持napi的網卡應該是直接放在ring buffer,不觸發硬中斷,直接使用軟中斷,拷貝ring buffer里的數據,直接輸送給上層處理,每個網卡在一次軟中斷處理過程能處理weight個frame)
過程中,網卡晶元對frame進行了MAC過濾,以減小系統負荷。(除了混雜模式)
網卡驅動程序將IP包添加14位元組的MAC頭,構成frame(暫無CRC)。Frame(暫無CRC)中含有發送端和接收端的MAC地址,由於是驅動程序創建MAC頭,所以可以隨便輸入地址,也可以進行主機偽裝。
驅動程序將frame(暫無CRC)拷貝到網卡晶元內部的緩沖區,由網卡處理。
網卡晶元將未完全完成的frame(缺CRC)再次封裝為可以發送的packet,也就是添加頭部同步信息和CRC校驗,然後丟到網線上,就完成一個IP報的發送了,所有接到網線上的網卡都可以看到該packet。
產生中斷的每個設備都有一個相應的中斷處理程序,是設備驅動程序的一部分。每個網卡都有一個中斷處理程序,用於通知網卡該中斷已經被接收了,以及把網卡緩沖區的數據包拷貝到內存中。
當網卡接收來自網路的數據包時,需要通知內核數據包到了。網卡立即發出中斷。內核通過執行網卡已注冊的中斷處理函數來做出應答。中斷處理程序開始執行,通知硬體,拷貝最新的網路數據包到內存,然後讀取網卡更多的數據包。
這些都是重要、緊迫而又與硬體相關的工作。內核通常需要快速的拷貝網路數據包到系統內存,因為網卡上接收網路數據包的緩存大小固定,而且相比系統內存也要小得多。所以上述拷貝動作一旦被延遲,必然造成網卡FIFO緩存溢出 - 進入的數據包占滿了網卡的緩存,後續的包只能被丟棄,這也應該就是ifconfig里的overrun的來源。
當網路數據包被拷貝到系統內存後,中斷的任務算是完成了,這時它把控制權交還給被系統中斷前運行的程序。
網卡的內核緩沖區,是在PC內存中,由內核控制,而網卡會有FIFO緩沖區,或者ring buffer,這應該將兩者區分開。FIFO比較小,裡面有數據便會盡量將數據存在內核緩沖中。
網卡中的緩沖區既不屬於內核空間,也不屬於用戶空間。它屬於硬體緩沖,允許網卡與操作系統之間有個緩沖;
內核緩沖區在內核空間,在內存中,用於內核程序,做為讀自或寫往硬體的數據緩沖區;
用戶緩沖區在用戶空間,在內存中,用於用戶程序,做為讀自或寫往硬體的數據緩沖區;
另外,為了加快數據的交互,可以將內核緩沖區映射到用戶空間,這樣,內核程序和用戶程序就可以同時訪問這一區間了。
對於有ring buffer的網卡,ring buffer是由驅動與網卡共享的,所以內核可以直接訪問ring buffer,一般拷貝frames的副本到自己的內核空間進行處理(deliver到上層協議,之後的一個個skb就是按skb的指針傳遞方式傳遞,直到用戶獲得數據,所以,對於ring buffer網卡,大量拷貝發生在frame從ring buffer傳遞到內核控制的計算機內存里)。
網卡工作在數據鏈路層,數據量鏈路層,會做一些校驗,封裝成幀。我們可以查看校驗是否出錯,確定傳輸是否存在問題。然後從軟體層面,是否因為緩沖區太小丟包。
一台機器經常收到丟包的報警,先看看最底層的有沒有問題:
(1) 查看工作模式是否正常
(2) 查看檢驗是否正常
Speed,Duplex,CRC 之類的都沒問題,基本可以排除物理層面的干擾。
Why rx_crc_errors incrementing in the receive counter of ethtool -S output?
Check ethtool -S output and find where are the drops and errors.
Check the numbers corresponding to rx_crc_errors .
顯示了p1p1 的介面類型,連接模式,速率等等信息,以及當前是否連接了網線(如果是網線Supported ports 就是TP,如果是光纖則顯示Fiber),這里例舉下3個重要關鍵詞
Supported ports: [ FIBRE ]
Speed: 10000Mb/s
Link detected: yes
ethtool
Counters Troubleshooting for Linux Driver
Why do I see rx_crc_errors in ethtool output?
ping請求錯誤分析
ifconfig 命令詳解
ethtool 命令詳解
ethtool 解決網卡丟包嚴重和網卡原理
『捌』 EOS的開發流程
EOS的是Block.One主導研發的一個區塊鏈底層公鏈系統,它專門為支撐商業去中心化 應用(Decentralized Application)而設計,其代碼開源。
比特幣被稱為區塊鏈1.0,因為它開辟了數字加密貨幣的天下,走出了從0到1的決定性一步。
以太坊被稱為區塊鏈2.0,因為它提供了可運行智能合約的圖靈完備的虛擬機,帶來了無限的可能性。
而EOS則被稱為區塊鏈3.0,為什麼? 兩個字:性能。
EOS的定位正是其首頁的口號:
英文:The most powerful infrastructure for decentralized applications。
中文:最強大的去中心化應用基礎設施。
EOS期望做加強版的以太坊,一個高吞吐量的智能合約平台。
以太坊雖然功能齊備,但受制於其設計選擇,15秒的出塊速度導致交易吞吐量 遠遠不能達到大規模實用的程度,大約只有30~40TPS(交易/秒)。而EOS則選擇了不同的技術路線,目標是達到可觀的百萬TPS——考慮到Visa實際的處理速度才1700TPS,這一目標的確相當誘人。
EOS的共識機制
比特幣和以太坊之所以吞吐量這么低,是受制於其設想的應用場景以及針對該場景所選擇的共識機制——這兩者都假設系統運行的環境完全不可信,因此都採用了工作量證明(Proof of Work)這種共識機制。
共識,顧名思義,就是大家對某件事達成統一的認識——對於 區塊鏈而言,某件事指的就是對交易的確認——任何一個節點要提交交易,都需要大家認可。
比特幣和以太坊目前所採用的PoW機制是傳奇人物中本聰的設計。在這種機制下,礦工們為了獲得記賬權和數字幣獎勵,需要不停挖礦來尋找合規的哈希值,通過對哈希值的共識來對交易數據進行確認和打包。PoW沒有準入門檻,任何節點都 有平等的權利參與記賬——當然,勝出的概率與算力有關:
RAM的價格是基於班科(Bancor)演算法,也就是說是由市場供需調節的:如果RAM供不應求,則買入RAM時就需要更多的EOS通證,而這時賣出RAM也能獲得更多的EOS通證。
內存是消耗資源,不可贖回,只能買賣。以EOS上發幣為例,目前發幣需要20M的內存,一個EOS可買20KB,按目前的存儲價格發一個幣需要消耗1000個EOS。這是EOS內存消耗的剛需來源。
課程概述
本課程面向對EOS去中心化應用開發感興趣的朋友,課程內容涵蓋EOS DApp開發的核心概念、智能合約的開發與部署以及前端頁面與EOS區塊鏈如何交互,並最終完成一個基於React和EOS的完整Dapp的開發。
第一章:進入EOS世界
了解EOS的定位與特點、共識機制、付費計算模型等核心概念。
第二章:Hi EOS
了解EOS節點的軟體整體框架以及節點伺服器、錢包伺服器和命令行工具的作用, 學習配置、啟動EOS節點伺服器和錢包伺服器的方法,初步了解命令行工具的使用方法。
第三章:錢包、密鑰與賬戶
理解EOS中與個人身份相關的三個核心概念:錢包、密鑰與賬戶,學習使用命令行工具 創建錢包、密鑰與賬戶的方法。
第四章:智能合約的開發與交互
了解智能合約的概念與作用,學習EOS智能合約的編寫和編譯,學習使用命令行工具 部署合約並與合約交互。
了解EOS智能合約中狀態的持久化機制,學習使用多索引表保存合約狀態。
第五章:發行自己的代幣
學習在EOS上發行代幣的原理和實現機制,並通過實際操作,掌握如何 使用命令行工具進行代幣的發行、轉賬和余額查看等操作。
第六章:使用代碼與智能合約交互
理解應用與EOS區塊鏈交互的原理,學習利用JSON RPC介面和eosjs封裝庫來 訪問EOS區塊鏈。
第七章:實戰便簽DApp開發
綜合運用EOS知識,使用React完成一個EOS便簽去中心化應用,學習從需求分析到 代碼實現的完整過程。
eos開發還是需要一個完整的學習的,上面的課程地址如下:EOS教程