原文標題:《LearnallaboutSolidityEthereum》
作者:VivekSingh
翻譯:去中心化金融社區
什么是Soilidity?
Solidity是一種面向合約的高級編程語言,用于實現智能合約。Solidity已經被設計用于以太坊虛擬機。
Solidity===智能合約。
Solidity的代碼封裝在合約中。合約是以太坊應用程序的基本構建塊——所有變量和函數都屬于一個合約,這將是所有項目的起點。
pragmasolidity>=0
studentpublicstudents;//createsanarraynamedstudentsofstudenttypeobjects
函數聲明
functioneatHamburgers(stringmemory_name,uint_amount)public{}
函數的可見性是公開的。有兩種方式可以傳遞參數給Solidity函數:
按值和按引用
eatHamburgers(“vitalik”,100);
私人/公共函數
在Solidity中,函數默認是公共的,因此任何人都可以在網絡中調用公共函數。然而,出于安全考慮,我們將函數設為私有,這樣只有所有者才能調用函數。
function_eatHamburgers(stringmemory_name,uint_amount)private{?
}
按照慣例,私有函數的開頭帶有下劃線。
日本金融巨頭SBI旗下交易平臺SBI VC Trade擬與Ripple拓展ODL服務戰略:7月29日消息,日本金融巨頭SBI集團旗下交易平臺SBI VC Trade總裁Tomohiko Kondo發推稱,SBI VC Trade擬作為Ripple合作伙伴利用XRP的國際匯款基礎設施ODL負責XRP的實時匯款,詳細公告將后續發布。
ODL是Ripple為支付提供商和金融機構提供的一項按需流動性服務,使用數字資產XRP作為橋梁貨幣以實現快速高效的跨境資金轉移,此前美國法官已裁決XRP不是證券。[2023/7/30 16:06:36]
內部/外部關鍵字
還有兩種類型的函數可見性。內部類似于私有,除了它可以被繼承的合約訪問,即繼承。
外部類似于公共。除了聲明了這個函數的聯系人之外,所有的合約都可以調用這個函數。
在函數中返回
函數聲明包含返回值的類型。
functionsayHi()publicview/purereturns(stringmemory){?
return“Hi”;
}
這些函數可以標記為pure/view。當我們甚至沒有訪問傳遞的數據時,我們就將函數標記為pure。如果函數不修改數據,只查看數據,那么它將被標記為view。
類型轉換
數據類型之間的轉換稱為類型轉換。
uint8a=5;?
uintb=6;
//linebelowthrowsanerrorbecausea*breturnsauint,notuint8:?
uint8c=a*b;
//wehavetotypecastbasauint8tomakeitwork:?
Coinbase:目前美國銀行賬戶交易故障已解決:10月3日消息,Coinbase此前出現無法受理涉及美國銀行賬戶的付款或提款的情況,調查結果顯示該故障系在創建ACH轉賬(通過自動清算網絡所進行的電子支付)時遇到了技術問題。目前該問題已被解決。
金色財經此前報道,Coinbase無法受理涉及美國銀行賬戶的付款或提款的故障系在創建ACH轉賬(通過自動清算網絡所進行的電子支付)時遇到了技術問題。官方表示,用戶資金安全,團隊正在努力修復全部功能。[2022/10/3 18:38:13]
uint8c=a*uint8(b);
事件
事件用于向前端傳達后端區塊鏈網絡上發生了一些事情。
//declaretheevent?
eventNotifyOnFrontend(uintx);?
functionadd(uint_x,uint_y)publicreturns(uint){?
?uintresult=_x+_y;?
//fireaneventtoletthefrontendknowthefunctionwascalled?
?emitNotifyOnFrontend(result);?
?returnresult;?
}
我們的前端代碼應該已經安裝了web3,并且應該監聽“NotifyOnFrontend”事件,這樣才能工作。我們的JavaScript框架或普通JS將不得不監聽這個事件來接收它:
YourContract.NotifyOnFrontend(function(error,result){?
//dosomethingwithresult?
Parallel Alpha系列NFT近24小時交易額增幅超4000%:金色財經報道,據OpenSea數據顯示,Parallel Alpha系列NFT近24小時交易額為371ETH,24小時交易額增幅達4034%,24小時交易額排名位列OpenSea第三。[2022/9/12 13:23:23]
})
映射
這是存儲有組織數據(如數組和結構)的另一種方法
mapping(address=>uint)publicaccountBalance;
這是一個鍵值存儲。address是鍵,accountBalance是值。
這可以用于在區塊鏈中存儲多個對象(數據)。檢查示例如下:
例子:
contractExample{?
??structUserInfo{?
?????unitage;stringdob;
}?
??mapping(string=>UserInfo)allusers;
functionsetUserInfo(string_name,uint_age,string_dob)public{
allusers.age=_age;
allusers.dob=_dob;
}
functiongetUserInfo(string?name)publicviewreturns(uint,string){?
???return(allusers.age,allusers.dob);?
?}?
Cardano核心開發人員:一個Bug導致測試網嚴重崩潰:8月19日消息,據Cardano核心開發人員Adam Dean在社交媒體披露,由于最近發現的一個Bug,導致Cardano區塊鏈測試網被災難性破壞。Adam聲稱,即將到來的Vasil硬分叉1.35.2版本內包含一個嚴重錯誤,該漏洞因為質押池運營商急于在主網升級時被發現。盡管該漏洞現在被發現,但大部分SPO已經將階段升級到了1.35.2版本,而本周早些時候推出的1.35.3版本目前還無法進行區塊鏈同步,現在只能在兩個沒有任何區塊歷史的新測試網上進行測試。
Adam Dean表示其已經敦促Input Output首席執行官Charles Hoskinson部署災難恢復計劃所需的工具,到目前為止,大約14%的SPO已升級到節點版本1.35.3,遠低于要求的75%閾值,本周三Charles Hoskinson曾在社交媒體呼吁SPO盡快將節點升級到最新版本,但當時不少用戶認為不要為了和以太坊競爭而急于升級。[2022/8/19 12:35:15]
}
現在,如果可以用不同的值多次調用setUserInfo,比如:
setuserInfo("Vivek",26,25/05/1995)setuserInfo("Supu",23,01/09/1998)
要獲得這些值,只需傳遞名稱:
getUserInfo("Vivek");//2625/05/1995?
getuserInfo("Supu");//2401/09/1998
全局變量
這些變量可用于像msg.sender這樣的所有函數。我們所編寫的任何Solidity程序,都應該由所有者調用。發送者的地址存儲在msg.sender全局變量中。
CME比特幣期貨持倉周報顯示:未平倉總量自10,051張小幅上升至10,841張:5月16日消息,CFTC5月4日至5月10日CME比特幣期貨持倉周報顯示:未平倉總量自10,051張小幅上升至10,841張。
機構多頭頭寸7,881張,空頭頭寸8,882張,多空持倉比例1:1.1,機構多空力量均衡,偏向于看空;
大戶多頭頭寸1,135張,空頭頭寸220張,多空持倉比例5.2:1,大戶對市場判斷樂觀;
散戶多頭頭寸989張,空頭頭寸909張,多空持倉比例1.1:1,散戶多空力量均衡,略微偏向于看漲;[2022/5/16 3:19:19]
require
require用于驗證這兩個語句,并據此做出決定。如果條件為真,則代碼成功運行,否則就拋出錯誤
functionsayHi(stringmemory?name)publicreturns(stringmemory){/Comparesif_nameequals“Vivek”Throwsanerrorandexitsifnottrue.Soliditydoesn’thavenativestringcomparison,sowecomparetheirkeccak256hashestoseeifthestringsareequaq?/?
require(keccak256(abi.encodePacked(name))==keccak256(abi.encodePacked(“Vivek”)));
//Ifit’strue,proceedwiththefunction:?
return“Hi!”;
}?
sayHi(“Vivek”)//executessuccessfully?
sayHi(“Supu”)//throwsanerror
因此,require對于在運行函數之前驗證某些條件必須為真非常有用。
繼承
有時候,與其制定一個非常長的合約,還不如將代碼邏輯拆分為多個合約來組織代碼。
contractAnimal{
??functioncatchphrase()publicreturns(stringmemory){?
???return“Animal”;
?}?
}contractCatisAnimal{
??functionanotherCatchphrase()publicreturns(stringmemory){?
???return“CatisanAnimal”;
}
}
import
將代碼拆分為多個文件,并使用import來使用另一個文件中的功能。
這通常是在Solidity項目中處理長代碼庫的方式。
存儲和內存
存儲是指永久存儲在區塊鏈上的變量。內存變量是臨時的,在對合約的外部函數調用之間會被刪除。可以把它想象成電腦的硬盤與內存。
與區塊鏈網絡中的其他合約交互
關于這一點,我將寫一篇單獨的文章。現在,保持簡短:
為了與其他合約交互,我們聲明了一個類似object的接口。我們創建了一個合約,并在里面聲明了一個函數,我們想要從另一個合約調用或使用它。函數只是骨架,它不包含主體。
contractGetNumber{?
??functiongetNum(uint_num)publicreturns(uint){?
???return_num;?
}
假設有一個合約,我們想要使用上面的getNum函數。為此,我們將在項目中創建一個合約,并聲明一個getNum函數框架(沒有函數體)。
contractNumberInterface{?
?functiongetNum(uint_num)publicreturns(uint);?
}
現在我們可以從NumberInterface合約中調用getNum函數。
在將合約部署到以太坊后,它就變成了不可變的,也就是說它不能被修改。部署到合約中的初始代碼將永久地停留在區塊鏈上。這就是安全性在Solidity中如此重要的原因之一。如果我們的合約代碼中有一個缺陷,就沒有辦法在以后修補它。必須告訴我們的用戶開始使用具有修復功能的不同智能合約地址。
函數修飾符
函數修飾符看起來就像函數,但是使用關鍵字修飾符而不是關鍵字函數。這些用于特殊情況,例如當您只希望您的所有者而不是所有人做某事時。
這有助于更新DApp的關鍵部分,同時防止其他用戶破壞我們的合約。我處理過的一個用例是——當我們想在執行任何用例之前驗證語句時。
gas
用戶支付gas費來在以太坊網絡上運行合約。gas以以太(以太坊上的貨幣)為單位計算。我們的函數的總gas成本等于它所有單獨操作的總gas成本。
更多關于存儲的內容
存儲內存被永久寫入到區塊鏈中。全世界成千上萬的節點需要將這些數據存儲在它們的硬盤上,并且隨著區塊鏈的增長,這些數據量也會隨著時間的推移而增長。所以這樣做是有代價的。
為了降低成本,我們希望避免將數據寫入存儲,除非絕對必要。有時,這涉及到看似低效的編程邏輯——比如每次調用函數時都要在內存中重新構建數組,而不是簡單地將該數組保存在全局存儲變量中以便快速查找。
因此,建議盡可能使用內存類型,這樣數據就不會永久存儲,從而節省成本。循環在Solidity中將比使用存儲更便宜。所以盡可能for循環中使用內存。這與Java、Python等語言中所做的完全相反,因為for循環的計算成本更高。
For循環
Syntax類似于Javascript。
for(uinti=1;i<=10;i++){//body}
應付修飾符
支付功能是使Solidity和以太坊如此酷的部分原因——它們是一種可以接收以太坊的特殊類型的功能。當我們在一個普通的web服務器上調用一個API函數時,我們不能在調用函數的同時發送美元——也不能發送比特幣。
但在以太坊中,因為貨幣(以太坊)、數據(交易有效載荷)和合約代碼本身都在以太坊上,所以我們可以同時調用一個函數并向合約支付費用。
這允許一些非常有趣的邏輯,比如為了執行一個函數,需要向合約支付一定的費用。
注意:
在以太坊中,當我們在合約上調用一個函數時,我們將其作為交易廣播到網絡上的一個或多個節點。節點在網絡上收集一些交易,試圖成為第一個解決計算密集型數學問題的“工作證明”,然后將這組交易連同他們的工作證明發布為一個塊到網絡的其余部分。
代幣
所以基本上,代幣只是一個合約,它記錄了誰擁有多少代幣,以及一些函數,以便這些用戶可以將他們的代幣轉移到其他地址。
assert與require的差異
Assert類似于require,如果為false則拋出錯誤。assert和require之間的區別是,當一個函數失敗時,require會退還用戶剩余的gas,而assert不會。
Metamask
這是Chrome和Firefox的瀏覽器擴展,允許用戶安全地管理他們的以太坊賬戶和私鑰,并使用這些賬戶與使用Web3.js的網站進行交互。
應用程序二進制接口。
在部署的合約之后,它會在以太坊上得到一個固定的地址,在那里它將永遠存在。在以太坊網絡中部署智能合約后,還會生成一個ABI。基本上,它是以JSON格式表示的合約方法,告訴Web3.js如何以我們的合約能夠理解的方式格式化函數調用。
Web3Js
以太坊的JS前端庫被稱為web3.js。
以技術力量推動企業碳管理數字化升級。12月2日,國網廣匯電動汽車服務有限公司與螞蟻鏈簽署合作協議,共同探索車場景下的碳管理技術路徑.
1900/1/1 0:00:00PanteraCapital合伙人PaulVeradittakit2021年12月3日發文介紹NEAR協議上的兼容以太坊的開發者平臺Aurora.
1900/1/1 0:00:00作者:北辰 自從去年的DeFiSummer以來,Crypto領域的金融業完成了資本主義世界歷經幾百年的迭代.
1900/1/1 0:00:00大家翹首以待的歡樂星期五來了!為回饋廣大用戶的長期支持,ZT于日前特意推出“歡樂星期五”,為用戶提供抽獎活動。該活動形式以盲盒為主,包含了當下熱門幣種以及ZT手辦等.
1900/1/1 0:00:00撰文|顧我,黑米 出品|白澤研究院 昨日,GameFi再次成為加密社區的焦點,起因是幣安智能鏈的GameFi游戲龍頭Mobox空投總價值高達100萬美元的NFT.
1900/1/1 0:00:00CellBattle是一款答題游戲,通過答題來賺取收益。目前Coinhub和CellBattle展開了深度合作,通過Coinhub啟動預約CellBattle盲盒可獲得兩個盲盒創建你的第一個去中.
1900/1/1 0:00:00