1.EVMorWASM?
隨著Ethereum的普及,我們在談論智能合約時,往往默認都是利用Solidity語言開發,基于EVM的智能合約。然而,由于Ethereum本身出塊時間慢,交易所需手續費高的一些缺點,越來越多的優化技術和新的公鏈得以推出。而WASM則是其中的一個代表性技術。作為一種全新的二進制語法,WASM有著諸多的優點,如指令體積小,運行速度快,并且內存安全。因此,運行在WASM上的智能合約可以大大減少占用的區塊鏈資源,明顯的提升出塊速度和效率,并且運行時更加穩定,使得用戶獲得更好的使用體驗。WASM支持多種不同的前端開發語言,包括Rust、C、C++、TypeScript、AssemblyScript等。考慮到適配以及工具鏈,并且語言本身的安全性,Rust是非常好的選擇之一。
2.BlockSec的選擇
BlockSec的使命是讓整個Defi生態更加的安全。因此,我們除了提供審計服務之外,也希望可以從安全開發的角度給予社區更多的支持。基于Rust和WASM的諸多優點,我們決定專門針對這一技術棧給大家帶來一系列的分享,也希望大家可以持續的關注我們。我們調研了如今一些比較流行的公鏈項目,其中NEAR公鏈也采用了同樣的技術棧。NEAR原生支持WASM合約,并且支持Rust語言和AssemblyScript開發智能合約。因此,我們將以NEAR公鏈為基礎,展開我們的分享與討論。
Offchain Labs:基于Arbitrum AnyTrust技術的主網Nova已向開發人員開放申請:7月12日消息,Arbitrum官方宣布,第一條基于Arbitrum AnyTrust技術構建的新鏈Arbitrum Nova已在主網上運行,并開放權限申請以供開發人員部署應用程序。在用戶可訪問之前,Offchain Labs將為開發人員提供至少兩周的時間來準備和構建Nova。
據悉,Nova是專為游戲,社交應用程序和對成本更敏感的用例而設計的全新網絡。Nova完全兼容EVM,并采用數據可用性委員會模式,因此不同于采用Optimistic Rollup架構將交易數據放在以太坊上的Arbitrum One。[2022/7/12 2:07:10]
3.用Rust開發智能合約
Rust語言由Mozilla主導開發,程序編譯后的運行速度驚人,且有相當高的內存利用率,并且支持函數式和面向對象的編程風格。也許很多同學還對Rust這門語言比較陌生。不過不用擔心,從本期博客開始,BlockSec會跟大家一起撥開Rust的迷霧,讓每個人都能利用Rust開發出高效,安全的智能合約。
4.環境配置
4.1IDE使用
VeChain基金會與Grant Thornton Cyprus達成合作:金色財經報道,VeChain基金會已經與會計和咨詢公司Grant Thornton Cyprus達成合作,計劃將區塊鏈解決方案擴展到各個行業,可能包括食品行業、制藥、物流、汽車行業、供應鏈管理、可再生能源等領域。[2020/8/18]
當我們在學習利用一門新的語言去開發時,選擇一個優秀的IDE一定是有必要的。在此,BlockSec推薦大家使用VisualStudioCode配合Rust的插件(例如Rust-analyzer),幾乎可以滿足大家的日常所需。如果大家有條件,也可以嘗試一下JetbrainsClion+Rust插件,學生可以免費使用哦。
4.2安裝Rust工具鏈
當有了一個優秀的IDE后,我們自然還需要下載安裝Rust。Rust提供了非常簡單便捷的安裝方法。在Linux系統中,我們只需要運行如下一行代碼,即可自動下載安裝Rust。
$curl--proto'=https'--tlsv1.2-sSfhttps://sh.rustup.rs|sh
安裝完畢后,我們可以通過執行$rustup--version來檢查安裝是否成功。rustup作為Rust工具鏈的管理器,提供了安裝、刪除、更新、選擇和管理這些工具鏈及其相關部件的方法。再此我們需要通過執行如下命令,將WASM(WebAssembly)目標添加到工具鏈:
動態 | 社交辯論平臺Trustory將關閉,創始人Preethi Kasireddy稱市場時機還不成熟:社交辯論平臺Trustory宣布關閉,其創始人Preethi Kasireddy發布文章解釋關閉的原因稱,由于目前市場時機不對,以至于TrueStory難以成為一門可持續發展的業務,并表示將資金退還給投資人。Preethi Kasireddy 稱,TruStory 這樣的平臺對于目前市場來說為時過早。具體來說,她陳述了 3 點原因,首先目前啟動基于加密貨幣的項目監管和合規風險太高,尤其是在美國,對于初創公司來說很難取得成功。其次,加密貨幣的基礎架構尚未發展成熟,需要更好的基礎架構(例如加密貨幣錢包)和無縫的授權解決方案(交易簽名)。第三,TruStory 這樣的平臺,目標用戶數以百萬計才可以持續發展,然而目前的現狀是,用戶規模不足以建立可持續的業務。根據 Block123.com 顯示,TruStory 的使命是基于切膚博弈的方式讓參與者理性參與辯論,從而基于任何話題產生富有成效的辯論結果。Preethi Kasireddy 是 TrueStory 的創始人,Andreessen Horowitz (a16z)前合伙人,Coinbase 前工程師,她曾構建并實施了將以太坊集成到 Coinbase 平臺所需的前端界面和 API 等。在停止 Trustory 項目后,Preethi Kasireddy表示日后將從事自己熱愛的教育和寫作工作。[2020/1/31]
$rustuptargetaddwasm32-unknown-unknown
動態 | 朝鮮黑客組織Lazarus最新活動揭露:近日,Kaspersky研究人員捕獲了使用Chrome 0day漏洞進行攻擊的行為,漏洞編號為CVE-2019-13720。經過相關研究人員分析,攻擊發起者是朝鮮的APT組織“Lazarus”。根據降維安全實驗室的情報,此組織在過去的2年時間內,一直對國際上的數字貨幣交易所以及其他相關企業進行APT攻擊(如之前我們實驗室捕獲并分析的DragonEx交易所被黑事件)。此漏洞異常危險,降維安全實驗室在此提醒交易所相關工作人員,切勿隨意點擊郵件或者聊天中的可疑鏈接,盡快將Chrome桌面版(Windows/Linux/MacOSX)更新到78.0.3904.87及以上版本。[2019/11/7]
5.第一個Rust合約
終于,我們到了正題。在這里,我們將通過深入剖析一個個智能合約的項目,帶大家了解并且掌握如何利用Rust編寫智能合約。如果大家對Rust語言本身感興趣,網上有很多的教程,大家也可以參考。
5.1Rust的包管理器
隨著整個開源社區對Rust的支持,各種各樣的第三方庫層出不窮。為了更好的管理這些庫,Cargo應運而生。上述的安裝命令,也會同時幫大家安裝Cargo。Cargo可協助開發者處理諸多任務,例如創建新的Rust項目,下載并編譯Rust項目所依賴的庫,以及完整地構建整個項目等。
nTrust:加拿大nTrust錢包官網發布公告稱,用戶已可以在其nTrust賬戶內購買、發送和接收、存儲、出售和取出BCH(比特幣現金)。[2017/12/23]
5.2創建第一個Rust合約項目
當我們準備好開發環境后,首先利用Cargo新建一個合約項目,并命名為StatusMessage。
$cargoinit--libStatusMessage
該項目的目錄樹如下:
StatusMessage/├──Cargo.toml└──src└──lib.rs
5.3聲明一個合約
一個智能合約(SmartContract)往往需要維護一組合約狀態數據。如下一段編寫于src/lib.rs的代碼聲明了一個簡單的合約,叫做StatusMessage。
1#2#3pubstructStatusMessage{4records:LookupMap<String,String>,5}
接下來,我們將仔細的分析上述的五行代碼。第1,2行以#開頭,類似注解。事實上,這是Rust中的一種宏的表現形式。它會接收第3-5行作為輸入,根據宏的定義,產生輸出。例如,第一行中的#事實上是在near-sdk-macros-version包中通過nearbindgen函數定義,這是利用宏自動生成注入代碼的地方(Macros-Auto-GeneratedInjectedCode,簡稱M.A.G.I.C.)。
如果不理解,沒關系。我們只需要知道第1,2行的作用即可。具體的來說,被#注解的struct將會成為NEAR上的一個智能合約。而其他的struct只是普通的struct。因此是由NEAR開發并且提供給開發者使用的包。而第2行中的#則是用來做序列化和反序列化,從而將合約的狀態可以在鏈上以二進制格式傳輸。第3-5行即為一個名為StatusMessage的結構體,其維護了一個智能合約的狀態。而狀態的內容在第4行中被描述。這一結構體中只含有一個成員變量,名為records。其類型為LookupMap,這里可以簡單的看作一個字典類型。key和value都是普通的字符串類型。
5.4設定合約默認值
當我們聲明了一個合約后,我們往往需要定義其默認值。如下代碼設定了合約StatusMessage的默認值。
1implDefaultforStatusMessage{2fndefault()->Self{3Self{4records:LookupMap::new(b"r".to_vec()),5}6}7}
其中,第1行聲明了這是對于StatusMessage默認值的一個實現。第2行聲明該方法名稱為default,返回值為Self。Self在Rust中即表示當前的模塊作用域,具體來說,即代表一個StatusMessage實例。而第3-5行即為該實例的定義。由于該實例僅包含records一個類型為LookupMap的變量。通過傳入一個二進制數組b"r".tovec(),即可將LookupMap初始化。其中LookupMap的new方法由NEAR自己定義,b"r".tovec()表明存儲于該LookupMap中鍵的前綴。
5.5定義合約方法
當我們用一個結構體定義了合約的狀態后,我們還需要定義一系列方法,從而可以通過外部交易,去調用這些暴露出來的方法。如下是兩個定義的方法,分別可以修改和獲得當前合約中的records值。注意,定義合約的方法時,也需要我們加上#,如第1行所示:
1#2implStatusMessage{3pubfnset_status(&mutself,message:String){4letaccount_id=env::signer_account_id();5self.records.insert(&account_id,&message);6}78pubfnget_status(&self,account_id:String)->Option<String>{9returnself.records.get(&account_id);10}11}
第2行impl關鍵字表明,我們在對StatusMessage做具體的實現。
第3-6行定義了方法setstatus。該函數用來設置當前合約的狀態。其中第三個聲明了方法名和變量。該函數共有兩個變量,分別為&mutself和message:String。&mut表示對self的引用,并且可能修改self的內容。而message:String表明了message的類型為String。同時該函數用關鍵字pub修飾,注意,只有被pubfn修飾的函數才可以被外部的交易調用,表明其是public。
第4行會定義一個局部變量accountid,其值通過env::signeraccountid()中獲取,表明發起這筆交易簽名的用戶id。
第5行將accountid做為鍵,message做為值插入到records中。注意,message是一個String類型的變量,由用戶傳入。而&message則表示對message的引用。
第8-10行則聲明了另外一個函數名為getstatus。不同于setstatus,getstatus會返回一個None或者是String類型的值,這里我們用Option表示。
第9行則是通過查詢用戶給定的account_id,得到對應的message。
本期總結和預告
這是BlockSec針對Rust合約開發的第一期blog,本期我們講述了Rust合約的背景,以及如何基于NEAR鏈去創建一個簡單的合約。下一期我們將進一步描述如何利用Rust對我們創建的合約編寫單元測試用例,從而調試我們的合約。
編譯出品|白澤研究院 「互聯網檔案館」是一個非盈利性的、提供互聯網資料檔案閱覽服務的數字圖書館,是布魯斯特·卡利于1996年創辦的.
1900/1/1 0:00:002015年,《經濟學人》雜志將區塊鏈譽為“信任機器”,能夠取代治理結構,取代機構,并將交易和信息的透明度提高到一個新的水平,對整個公共生活產生影響.
1900/1/1 0:00:0010月27日,以“鏈上相城,驅動未來”為主題的相城區區塊鏈產業創新發展論壇在蘇州相城區舉行。相城區副區長劉強,區委常委、相城高新區黨工委書記、元和街道黨工委書記王執晴在會上發表了致辭,江蘇恒為信.
1900/1/1 0:00:00一個母親為了挽救類似于植物人的女兒,通過腦機接口將她的大腦數據上傳到了云端,隨后借助某種數字芯片以虛擬的形式和女兒進行互動,但不慎被邪惡力量“奪舍”,后在柳夜熙的幫助下將邪惡力量剝除.
1900/1/1 0:00:00日前,工業和信息化部、中央網絡安全和信息化委員會辦公室發布《關于加快推動區塊鏈技術應用和產業發展的指導意見》。意見提出:到2025年,區塊鏈產業綜合實力達到世界先進水平,產業初具規模.
1900/1/1 0:00:00本文由EigenLabs譯制,原文作者ZhenYuYong。請點擊閱讀原文獲取文章英文原版內容,EigenTeam將持續為您輸送區塊鏈最新干貨,請您持續關注!Enjoy~隨著區塊鏈和其他加密用例.
1900/1/1 0:00:00