W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
筆記
本節(jié)不適用于solcjs,即使它在命令行模式下使用也是如此。
Solidity 存儲(chǔ)庫(kù)的構(gòu)建目標(biāo)之一是soliditysolc
命令行編譯器。使用為您提供所有選項(xiàng)的解釋。編譯器可以產(chǎn)生各種輸出,從簡(jiǎn)單的二進(jìn)制文件和抽象語(yǔ)法樹(shù)(解析樹(shù))上的匯編到氣體使用量的估計(jì)。如果你只想編譯一個(gè)文件,你運(yùn)行它,它會(huì)打印二進(jìn)制文件。如果您想獲得一些更高級(jí)的輸出變體,最好告訴它輸出所有內(nèi)容以使用.solc --help
solc --bin sourceFile.sol
solc
solc -o outputDirectory --bin --ast-compact-json --asm sourceFile.sol
在部署合約之前,請(qǐng)?jiān)诰幾g時(shí)使用. 默認(rèn)情況下,優(yōu)化器將優(yōu)化合約,假設(shè)它在其生命周期內(nèi)被調(diào)用 200 次(更具體地說(shuō),它假設(shè)每個(gè)操作碼被執(zhí)行大約 200 次)。如果您希望最初的合約部署更便宜,而后來(lái)的功能執(zhí)行更昂貴,請(qǐng)將其設(shè)置為. 如果您期望有很多事務(wù)并且不關(guān)心更高的部署成本和輸出大小,請(qǐng)?jiān)O(shè)置為較高的數(shù)字。此參數(shù)對(duì)以下內(nèi)容有影響(將來(lái)可能會(huì)更改):solc --optimize --bin sourceFile.sol
--optimize-runs=1
--optimize-runs
函數(shù)調(diào)度例程中二分查找的大小
存儲(chǔ)大數(shù)或字符串等常量的方式
命令行編譯器會(huì)自動(dòng)從文件系統(tǒng)讀取導(dǎo)入的文件,但也可以使用以下方式提供路徑重定向:prefix=path
solc github.com/ethereum/dapp-bin/=/usr/local/lib/dapp-bin/ file.sol
這實(shí)際上指示編譯器搜索以 github.com/ethereum/dapp-bin/
under開(kāi)頭的任何內(nèi)容/usr/local/lib/dapp-bin
。
在訪問(wèn)文件系統(tǒng)以搜索導(dǎo)入時(shí),不以 ./ 或 ../ 開(kāi)頭的路徑被視為相對(duì)于使用 --base-path
和--include-path
選項(xiàng)指定的目錄(如果未指定基本路徑,則為當(dāng)前工作目錄)。此外,通過(guò)這些選項(xiàng)添加的路徑部分不會(huì)出現(xiàn)在合約元數(shù)據(jù)中。
出于安全原因,編譯器對(duì)其可以訪問(wèn)的目錄有限制。在命令行上指定的源文件目錄和重新映射的目標(biāo)路徑自動(dòng)允許文件閱讀器訪問(wèn),但默認(rèn)情況下會(huì)拒絕其他所有內(nèi)容。可以通過(guò)開(kāi)關(guān)允許其他路徑(及其子目錄) 。始終允許通過(guò)指定路徑內(nèi)的所有內(nèi)容。--allow-paths /sample/path,/another/sample/path
--base-path
以上只是對(duì)編譯器如何處理導(dǎo)入路徑的簡(jiǎn)化。有關(guān)極端情況的示例和討論的詳細(xì)說(shuō)明,請(qǐng)參閱 路徑解析部分。
如果您的合同使用庫(kù),您會(huì)注意到字節(jié)碼包含表單的子字符串__$53aea86b7d70b31448b230b20ae141a537$__
。這些是實(shí)際圖書(shū)館地址的占位符。占位符是完全限定庫(kù)名稱的 keccak256 散列的十六進(jìn)制編碼的 34 個(gè)字符前綴。字節(jié)碼文件最后還將包含表單行,以幫助識(shí)別占位符代表哪些庫(kù)。請(qǐng)注意,完全限定的庫(kù)名稱是其源文件的路徑,庫(kù)名稱由. 您可以用作鏈接器,這意味著它將在這些點(diǎn)為您插入庫(kù)地址:// <placeholder> -> <fq library name>
:
solc
添加到您的命令以提供每個(gè)庫(kù)的地址(使用逗號(hào)或空格作為分隔符)或?qū)⒆址鎯?chǔ)在文件中(每行一個(gè)庫(kù))并使用.--libraries "file.sol:Math=0x1234567890123456789012345678901234567890 file.sol:Heap=0xabCD567890123456789012345678901234567890"
solc
--libraries fileName
筆記
從 Solidity 0.8.1 開(kāi)始接受=
庫(kù)和地址之間:
的分隔符,并且不推薦使用分隔符。將來(lái)會(huì)被刪除。目前也可以。--libraries "file.sol:Math:0x1234567890123456789012345678901234567890 file.sol:Heap:0xabCD567890123456789012345678901234567890"
如果solc
使用 option 調(diào)用--standard-json
,它將期望標(biāo)準(zhǔn)輸入上的 JSON 輸入(如下所述),并在標(biāo)準(zhǔn)輸出上返回 JSON 輸出。對(duì)于更復(fù)雜且特別是自動(dòng)化的使用,這是推薦的界面。該過(guò)程將始終以“成功”狀態(tài)終止,并通過(guò) JSON 輸出報(bào)告任何錯(cuò)誤。該選項(xiàng)--base-path
也在標(biāo)準(zhǔn) json 模式下處理。
如果solc
使用 option 調(diào)用--link
,所有輸入文件都被解釋為上面給出的 -format 中未鏈接的二進(jìn)制文件(十六進(jìn)制編碼)__$53aea86b7d70b31448b230b20ae141a537$__
并就地鏈接(如果從 stdin 讀取輸入,則將其寫(xiě)入 stdout)。在這種情況下,除 之外的所有選項(xiàng)都--libraries
將被忽略(包括-o
)。
警告
不鼓勵(lì)在生成的字節(jié)碼上手動(dòng)鏈接庫(kù),因?yàn)樗粫?huì)更新合約元數(shù)據(jù)。由于元數(shù)據(jù)包含編譯時(shí)指定的庫(kù)列表,而字節(jié)碼包含元數(shù)據(jù)哈希,因此您將獲得不同的二進(jìn)制文件,具體取決于執(zhí)行鏈接的時(shí)間。
如果您使用編譯器的標(biāo)準(zhǔn) JSON 接口,您應(yīng)該要求編譯器在編譯合約時(shí)使用--libraries
選項(xiàng)solc
或密鑰來(lái)鏈接庫(kù)。libraries
筆記
庫(kù)占位符曾經(jīng)是庫(kù)本身的完全限定名稱,而不是它的哈希。仍然支持這種格式,但編譯器將不再輸出它。進(jìn)行此更改是為了減少庫(kù)之間發(fā)生沖突的可能性,因?yàn)橹荒苁褂猛耆薅◣?kù)名稱的前 36 個(gè)字符。solc --link
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: