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