比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > SAND > Info

解析Soilidity:用于實現智能合約的高級編程語言_INT

Author:

Time:1900/1/1 0:00:00

原文標題:《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{?

}

按照慣例,私有函數的開頭帶有下劃線。

Andrew Kang昨日晚間購入價值約105萬美元的RDNT代幣:6月8日消息,據鏈上分析師余燼監測,昨日19時,Mechanism Capital聯合創始人Andrew Kang通過鏈上和幣安一共買入3717429枚RDNT(約合105萬美元),成本在0.285美元左右,隨后Kang就在其社交媒體上宣傳該代幣。

不過,余燼提及,Andrew Kang前幾日曾以1.21美元的均價購入117萬枚ARB,目前仍處于浮虧狀態。[2023/6/8 21:23:04]

內部/外部關鍵字

還有兩種類型的函數可見性。內部類似于私有,除了它可以被繼承的合約訪問,即繼承。

外部類似于公共。除了聲明了這個函數的聯系人之外,所有的合約都可以調用這個函數。

在函數中返回

函數聲明包含返回值的類型。

functionsayHi()publicview/purereturns(stringmemory){?

return“Hi”;

}

這些函數可以標記為pure/view。當我們甚至沒有訪問傳遞的數據時,我們就將函數標記為pure。如果函數不修改數據,只查看數據,那么它將被標記為view。

類型轉換

數據類型之間的轉換稱為類型轉換。

uint8a=5;?

uintb=6;

//linebelowthrowsanerrorbecausea*breturnsauint,notuint8:?

uint8c=a*b;

//wehavetotypecastbasauint8tomakeitwork:?

Voyager債權人提出動議,要求任命Voyager破產案受托人接管公司資產:金色財經報道,Voyager的一位債權人和財務律師希望在Voyager Digital的破產案中任命受托人,這將導致Voyager失去對其財產的控制。在2月1日的一項動議中,Voyager債權人Michelle DiVita指控Voyager有“在破產程序開始時已知或合理發現的財務報表不準確和公開虛假陳述的歷史”。由于這種破產前的行為,DiVita認為應該任命審查員或受托人負責處理破產程序。

該文件稱,Voyager通過發布財務報告,嚴重低估了其貸款頭寸超過10億美元,從而隱瞞了其貸款活動的真實性質。[2023/2/2 11:42:57]

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將不得不監聽這個事件來接收它:

BTC反彈至1.7萬美元上方后推動美股上市礦企普漲:金色財經報道,由于能源價格上漲和比特幣價格下跌,公司的利潤在整個2022年受到擠壓,但隨著近期比特幣價格反彈至17,000美元上方,美股上市礦企股價出現普漲。截至美國東部時間1月9日,Bitfarms已上漲32%,而Marathon上漲24%,Riot上漲了18%。不過,仍有部分加密礦企的股價低于1美元,比如Core Scientific、Stronghold DigitalMining、Digihost Technology等。(theblock)[2023/1/10 11:03:41]

YourContract.NotifyOnFrontend(function(error,result){?

//dosomethingwithresult?

})

映射

這是存儲有組織數據(如數組和結構)的另一種方法

mapping(address=>uint)publicaccountBalance;

這是一個鍵值存儲。address是鍵,accountBalance是值。

這可以用于在區塊鏈中存儲多個對象(數據)。檢查示例如下:

例子:

contractExample{?

??structUserInfo{?

?????unitage;stringdob;

}?

??mapping(string=>UserInfo)allusers;

functionsetUserInfo(string_name,uint_age,string_dob)public{

慢霧:NimbusPlatform遭遇閃電貸攻擊,損失278枚BNB:據慢霧安全團隊情報,2022 年 12 月 14 日, BSC 鏈上的NimbusPlatform項目遭到攻擊,攻擊者獲利約278枚BNB。慢霧安全團隊以簡訊的形式分享如下:

1. 攻擊者首先在 8 天前執行了一筆交易(0x7d2d8d),把 20 枚 BNB 換成 NBU_WBNB 再換成 GNIMB 代幣,然后把 GNIMB 代幣轉入 Staking 合約作質押,為攻擊作準備;

2. 在 8 天后正式發起攻擊交易(0x42f56d3),首先通過閃電貸借出 75477 枚 BNB 并換成 NBU_WBNB,然后再用這些 NBU_WBNB 代幣將池子里的絕大部分 NIMB 代幣兌換出;

3. 接著調用 Staking 合約的 getReward 函數進行獎勵的提取,獎勵的計算是和 rate 的值正相關的,而 rate 的值則取決于池子中 NIMB 代幣和 GNIMB 代幣的價格,由于 NIMB 代幣的價格是根據上一步閃電貸中被操控的池子中的代幣數量來計算的,導致其由于閃電貸兌換出大量的代幣而變高,最后計算的獎勵也會更多;

4. 攻擊者最后將最后獲得的 GNIMB 代幣和擁有的 NIMB 代幣換成 NBU_WBNB 代幣后再換成 BNB,歸還閃電貸獲利;

此次攻擊的主要原因在于計算獎勵的時候僅取決于池子中的代幣數量導致被閃電貸操控,從而獲取比預期更多的獎勵。慢霧安全團隊建議在進行代幣獎計算時應確保價格來源的安全性。[2022/12/14 21:44:29]

allusers.age=_age;

allusers.dob=_dob;

}

functiongetUserInfo(string?name)publicviewreturns(uint,string){?

CoinList為社區銷售引入額外購買分配請求功能:10月28日消息,CoinList宣布為社區銷售引入額外分配請求功能,允許在社區銷售期間購買上限數量代幣的合格注冊用戶提交額外購買分配請求。如果在社區銷售后剩余未分配代幣,則會隨機分配給提交額外購買分配請求的用戶。[2022/10/28 11:51:34]

???return(allusers.age,allusers.dob);?

?}?

}

現在,如果可以用不同的值多次調用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全局變量中。

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。

Tags:RININTETUUINNeutrino USDArtificial Liquid Intelligencecetus幣會漲到多少QUINTA價格

SAND
Coinhub 與 CellBattle 專屬福利領取教程_COIN

CellBattle是一款答題游戲,通過答題來賺取收益。目前Coinhub和CellBattle展開了深度合作,通過Coinhub啟動預約CellBattle盲盒可獲得兩個盲盒創建你的第一個去中.

1900/1/1 0:00:00
牛市在即!中國市場投資熱情不斷高漲,矚意$HOKK暴漲百倍,或將飛漲至1美元!_ANC

TELEGRAM中文社區:@hokkchinese據CoinMarketCap數據顯示:2021年11月22日,$HOKK24小時內飆升15.72%.

1900/1/1 0:00:00
牛市、熊市和橫盤的三種期權交易策略(丐中丐版難度)_TAL

作者:北辰 自從去年的DeFiSummer以來,Crypto領域的金融業完成了資本主義世界歷經幾百年的迭代.

1900/1/1 0:00:00
Facebook十年來的失誤應該成為Web3時代的教訓_WEB

撰文:SamLessin,?SlowVentures合伙人 編譯:Noodle 很久以前,也就是2011年,Facebook推出了?"開放圖譜".

1900/1/1 0:00:00
鏈游黑馬 Doom Hero_HERO

鏈游,playtoearn鏈游,區塊鏈游戲,以“Play-To-Earn”,即“玩賺”的新經濟模型為內核的鏈游業態迅速出圈.

1900/1/1 0:00:00
風投Variant Fund聯合創始人:DAO是工人運動的下一階段_OSMO

原標題|VariantFund聯創:DAO是工人運動的下一階段作者|LiJin,VariantFund聯合創始人編譯:0x22D.

1900/1/1 0:00:00
ads