原文標題:《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{?
}
按照慣例,私有函數的開頭帶有下劃線。
深圳:將統籌設立規模1000億元的人工智能基金群:6月6日消息,日前,深圳印發《深圳市加快推動人工智能高質量發展高水平應用行動方案(2023—2024年)》(以下簡稱《行動方案》),發布首批 “城市+AI”應用場景清單,并統籌設立規模1000億元的人工智能基金群,積極打造國家新一代人工智能創新發展試驗區和國家人工智能創新應用先導區,創建人工智能先鋒城市。[2023/6/6 21:18:18]
內部/外部關鍵字
還有兩種類型的函數可見性。內部類似于私有,除了它可以被繼承的合約訪問,即繼承。
外部類似于公共。除了聲明了這個函數的聯系人之外,所有的合約都可以調用這個函數。
在函數中返回
函數聲明包含返回值的類型。
functionsayHi()publicview/purereturns(stringmemory){?
return“Hi”;
}
這些函數可以標記為pure/view。當我們甚至沒有訪問傳遞的數據時,我們就將函數標記為pure。如果函數不修改數據,只查看數據,那么它將被標記為view。
類型轉換
數據類型之間的轉換稱為類型轉換。
uint8a=5;?
uintb=6;
//linebelowthrowsanerrorbecausea*breturnsauint,notuint8:?
uint8c=a*b;
//wehavetotypecastbasauint8tomakeitwork:?
uint8c=a*uint8(b);
BAYC#1360入駐騰訊QQ元宇宙:金色財經報道,近日,騰訊上線QQJOY云上嘉年華,以新次元宇宙,超現實快樂為主題,主打元宇宙概念,在微博、微信朋友圈等渠道宣發試水。
騰訊此次試圖以元宇宙的形式,整合游戲、潮牌、直播等多個賽道的優勢資源,聯手由藤原浩等人創立的頂級潮流機構HONEYEE.COM,邀請Eric So等6位潮流藝術家,以及歐陽娜娜、薛凱琪等明星站臺,在年輕群體進一步推廣數字資產的可能性。
BAYC#1360作為重點展示,表現了騰訊對NFT行業的積極探索。此次活動中還有VANS的虛實同款潮鞋、中國航天天宮開物的獨家徽章、OG同款藝術畫作等,都可以看作騰訊對NFT的概念性嘗試。
無聊猿Bored Ape Yacht Club 系列總共10000個,本次亮相的無聊猿為編號#1360,也是騰訊首次將無聊猿放入其打造的元宇宙當中。BAYC#1360 持有人尚未公布,猜測是騰訊團隊或高層持有。[2022/12/31 22:17:47]
事件
事件用于向前端傳達后端區塊鏈網絡上發生了一些事情。
//declaretheevent?
eventNotifyOnFrontend(uintx);?
functionadd(uint_x,uint_y)publicreturns(uint){?
?uintresult=_x+_y;?
//fireaneventtoletthefrontendknowthefunctionwascalled?
?emitNotifyOnFrontend(result);?
?returnresult;?
}
我們的前端代碼應該已經安裝了web3,并且應該監聽“NotifyOnFrontend”事件,這樣才能工作。我們的JavaScript框架或普通JS將不得不監聽這個事件來接收它:
比特幣白皮書海報出現在在蘇格蘭街頭:10月22日消息,Watcher.Guru發布推文稱,比特幣白皮書海報近日出現在在蘇格蘭街頭。[2022/10/22 16:35:12]
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{
allusers.age=_age;
allusers.dob=_dob;
}
functiongetUserInfo(string?name)publicviewreturns(uint,string){?
???return(allusers.age,allusers.dob);?
Flashbots產品負責人Bert Miller:“0xbaDc0dE”開頭地址在單筆交易中賺了 800 ETH,但一小時后被黑客盜走損失1,100 ETH:金色財經報道,據研究機構 Flashbots 產品負責人 Bert Miller 在社交媒體發文稱,一個“0xbaDc0dE”開頭地址的 MEV Bot 機器人操作員在單筆交易中賺了 800 ETH,但一小時后損失了高達 1,100 ETH,該地址在過去幾個月中執行了 220,000 筆交易。Bert Miller 解釋說,“0xbaDc0dE” 利用了一位試圖在 Uniswap v2 上出售價值 180 萬美元 cUSDC 的用戶,通過將交易與涉及許多不同 DeFi dApp 精心套利交易賺了 800 ETH(102 萬美元),而那位不幸的賣家從該交易中只收到了 500 美元。但僅僅一個小時后,“0xbaDc0dE” 所有 ETH 都被盜了,一名黑客從該錢包中獲取 1,101 ETH(約合 140 萬美元),區塊鏈安全公司 PeckShield 也發現了這筆交易并發布了與黑客相關的鏈上信息。[2022/9/29 22:38:56]
?}?
}
現在,如果可以用不同的值多次調用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全局變量中。
分析師Venturefounder:對于長期投資者來說,BTC被低估了:金色財經報道,分析師Venturefounder發推稱,比特幣實際價格是所有比特幣在購買價格時的價值除以比特幣的數量。這是購買所有比特幣的平均成本基礎。21700美元是BTC現在的實際價格。BTC歷史上只有幾次低于其實際價格交易,每次都是在接近周期底部的觸底期間。
BTC在 25,000 美元反彈期間高于實際價格,然后又回到低于它,目前通常小于實際價格,對于長期投資者來說,BTC被低估了,另一個值得注意的有趣事情是,在2018年周期中,BTC觸底發生在實現價格的30%折扣。本周期與實際價格最接近的折扣是16%,現在實現價格的30%折扣將使BTC達到15,000 美元。[2022/8/21 12:38:39]
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。
?從開發者的角度來看,在提供持續的玩家粘性和玩家生命周期價值數據方面,P2E機制比傳統的游戲獎勵方式可能更好.
1900/1/1 0:00:00吳說作者?|?袁奔 本期編輯?|?ColinWu一直以來關于區塊鏈在加密貨幣之外的實際應用,都是區塊鏈從業者一直在探索的目標.
1900/1/1 0:00:00與現在常見的組織管理形式相比,DAO存在明顯的去中心化特點。但中心化與去中心不是非此即彼的,許多的DAO組織也或多或少的依靠中心化開啟或者維持,并未做到絕對的去中心化.
1900/1/1 0:00:00昨天,全球金融市場發生暴跌。美國三大股票指數平均跌幅超過2%、歐洲四大指數跌幅超過3%、香港恒生指數跌幅超過2%、日本日經指數跌幅超過2%.
1900/1/1 0:00:00作者?|?Footprint分析師Simon編輯?|?ColinWu?本文為吳說與Footprint獨家合作內容近期游戲類融資十分火爆.
1900/1/1 0:00:00作者:StuLustman翻譯:Blockunicorn經典投資也有一些?關于加密投資的知識。到目前為止,幾乎每個人都聽說過羅伯特清崎的經典個人理財書籍《富爸爸窮爸爸》.
1900/1/1 0:00:00