mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Add --no-append-metadata in CLI and metadata.append in JSON
				
					
				
			Skips appending metadata to the binary
This commit is contained in:
		
							parent
							
								
									8b7010872c
								
							
						
					
					
						commit
						f96e802e74
					
				| @ -308,6 +308,7 @@ void CompilerStack::reset(bool _keepSettings) | ||||
| 		m_revertStrings = RevertStrings::Default; | ||||
| 		m_optimiserSettings = OptimiserSettings::minimal(); | ||||
| 		m_metadataLiteralSources = false; | ||||
| 		m_metadataFormat = defaultMetadataFormat(); | ||||
| 		m_metadataHash = MetadataHash::IPFS; | ||||
| 		m_stopAfter = State::CompilationSuccessful; | ||||
| 	} | ||||
| @ -1548,6 +1549,9 @@ string CompilerStack::createMetadata(Contract const& _contract, bool _forIR) con | ||||
| 	if (m_revertStrings != RevertStrings::Default) | ||||
| 		meta["settings"]["debug"]["revertStrings"] = revertStringsToString(m_revertStrings); | ||||
| 
 | ||||
| 	if (m_metadataFormat == MetadataFormat::NoMetadata) | ||||
| 		meta["settings"]["metadata"]["appendCBOR"] = false; | ||||
| 
 | ||||
| 	if (m_metadataLiteralSources) | ||||
| 		meta["settings"]["metadata"]["useLiteralContent"] = true; | ||||
| 
 | ||||
|  | ||||
| @ -349,6 +349,11 @@ public: | ||||
| 	/// caused by differences in metadata. Should only be used for testing.
 | ||||
| 	void setMetadataFormat(MetadataFormat _metadataFormat) { m_metadataFormat = _metadataFormat; } | ||||
| 
 | ||||
| 	static MetadataFormat defaultMetadataFormat() | ||||
| 	{ | ||||
| 		return VersionIsRelease ? MetadataFormat::WithReleaseVersionTag : MetadataFormat::WithPrereleaseVersionTag; | ||||
| 	} | ||||
| 
 | ||||
| private: | ||||
| 	/// The state per source unit. Filled gradually during parsing.
 | ||||
| 	struct Source | ||||
| @ -515,7 +520,7 @@ private: | ||||
| 	/// Whether or not there has been an error during processing.
 | ||||
| 	/// If this is true, the stack will refuse to generate code.
 | ||||
| 	bool m_hasError = false; | ||||
| 	MetadataFormat m_metadataFormat = VersionIsRelease ? MetadataFormat::WithReleaseVersionTag : MetadataFormat::WithPrereleaseVersionTag; | ||||
| 	MetadataFormat m_metadataFormat = defaultMetadataFormat(); | ||||
| }; | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -509,6 +509,8 @@ std::optional<Json::Value> checkMetadataKeys(Json::Value const& _input) | ||||
| { | ||||
| 	if (_input.isObject()) | ||||
| 	{ | ||||
| 		if (_input.isMember("appendCBOR") && !_input["appendCBOR"].isBool()) | ||||
| 			return formatFatalError(Error::Type::JSONError, "\"settings.metadata.appendCBOR\" must be Boolean"); | ||||
| 		if (_input.isMember("useLiteralContent") && !_input["useLiteralContent"].isBool()) | ||||
| 			return formatFatalError(Error::Type::JSONError, "\"settings.metadata.useLiteralContent\" must be Boolean"); | ||||
| 
 | ||||
| @ -516,7 +518,7 @@ std::optional<Json::Value> checkMetadataKeys(Json::Value const& _input) | ||||
| 		if (_input.isMember("bytecodeHash") && !hashes.count(_input["bytecodeHash"].asString())) | ||||
| 			return formatFatalError(Error::Type::JSONError, "\"settings.metadata.bytecodeHash\" must be \"ipfs\", \"bzzr1\" or \"none\""); | ||||
| 	} | ||||
| 	static set<string> keys{"useLiteralContent", "bytecodeHash"}; | ||||
| 	static set<string> keys{"appendCBOR", "useLiteralContent", "bytecodeHash"}; | ||||
| 	return checkKeys(_input, keys, "settings.metadata"); | ||||
| } | ||||
| 
 | ||||
| @ -911,6 +913,12 @@ std::variant<StandardCompiler::InputsAndSettings, Json::Value> StandardCompiler: | ||||
| 	if (auto result = checkMetadataKeys(metadataSettings)) | ||||
| 		return *result; | ||||
| 
 | ||||
| 	solAssert(CompilerStack::defaultMetadataFormat() != CompilerStack::MetadataFormat::NoMetadata, ""); | ||||
| 	ret.metadataFormat = | ||||
| 		metadataSettings.get("appendCBOR", Json::Value(true)).asBool() ? | ||||
| 		CompilerStack::defaultMetadataFormat() : | ||||
| 		CompilerStack::MetadataFormat::NoMetadata; | ||||
| 
 | ||||
| 	ret.metadataLiteralSources = metadataSettings.get("useLiteralContent", Json::Value(false)).asBool(); | ||||
| 	if (metadataSettings.isMember("bytecodeHash")) | ||||
| 	{ | ||||
| @ -1086,6 +1094,7 @@ Json::Value StandardCompiler::compileSolidity(StandardCompiler::InputsAndSetting | ||||
| 		compilerStack.selectDebugInfo(_inputsAndSettings.debugInfoSelection.value()); | ||||
| 	compilerStack.setLibraries(_inputsAndSettings.libraries); | ||||
| 	compilerStack.useMetadataLiteralSources(_inputsAndSettings.metadataLiteralSources); | ||||
| 	compilerStack.setMetadataFormat(_inputsAndSettings.metadataFormat); | ||||
| 	compilerStack.setMetadataHash(_inputsAndSettings.metadataHash); | ||||
| 	compilerStack.setRequestedContractNames(requestedContractNames(_inputsAndSettings.outputSelection)); | ||||
| 	compilerStack.setModelCheckerSettings(_inputsAndSettings.modelCheckerSettings); | ||||
|  | ||||
| @ -83,6 +83,7 @@ private: | ||||
| 		std::optional<langutil::DebugInfoSelection> debugInfoSelection; | ||||
| 		std::map<std::string, util::h160> libraries; | ||||
| 		bool metadataLiteralSources = false; | ||||
| 		CompilerStack::MetadataFormat metadataFormat = CompilerStack::defaultMetadataFormat(); | ||||
| 		CompilerStack::MetadataHash metadataHash = CompilerStack::MetadataHash::IPFS; | ||||
| 		Json::Value outputSelection; | ||||
| 		ModelCheckerSettings modelCheckerSettings = ModelCheckerSettings{}; | ||||
|  | ||||
| @ -689,6 +689,7 @@ void CommandLineInterface::compile() | ||||
| 	{ | ||||
| 		if (m_options.metadata.literalSources) | ||||
| 			m_compiler->useMetadataLiteralSources(true); | ||||
| 		m_compiler->setMetadataFormat(m_options.metadata.format); | ||||
| 		m_compiler->setMetadataHash(m_options.metadata.hash); | ||||
| 		if (m_options.modelChecker.initialize) | ||||
| 			m_compiler->setModelCheckerSettings(m_options.modelChecker.settings); | ||||
|  | ||||
| @ -62,6 +62,7 @@ static string const g_strLibraries = "libraries"; | ||||
| static string const g_strLink = "link"; | ||||
| static string const g_strLSP = "lsp"; | ||||
| static string const g_strMachine = "machine"; | ||||
| static string const g_strNoCBORMetadata = "no-cbor-metadata"; | ||||
| static string const g_strMetadataHash = "metadata-hash"; | ||||
| static string const g_strMetadataLiteral = "metadata-literal"; | ||||
| static string const g_strModelCheckerContracts = "model-checker-contracts"; | ||||
| @ -240,6 +241,7 @@ bool CommandLineOptions::operator==(CommandLineOptions const& _other) const noex | ||||
| 		compiler.outputs == _other.compiler.outputs && | ||||
| 		compiler.estimateGas == _other.compiler.estimateGas && | ||||
| 		compiler.combinedJsonRequests == _other.compiler.combinedJsonRequests && | ||||
| 		metadata.format == _other.metadata.format && | ||||
| 		metadata.hash == _other.metadata.hash && | ||||
| 		metadata.literalSources == _other.metadata.literalSources && | ||||
| 		optimizer.enabled == _other.optimizer.enabled && | ||||
| @ -748,6 +750,10 @@ General Information)").c_str(), | ||||
| 
 | ||||
| 	po::options_description metadataOptions("Metadata Options"); | ||||
| 	metadataOptions.add_options() | ||||
| 		( | ||||
| 			g_strNoCBORMetadata.c_str(), | ||||
| 			"Do not append CBOR metadata to the end of the bytecode." | ||||
| 		) | ||||
| 		( | ||||
| 			g_strMetadataHash.c_str(), | ||||
| 			po::value<string>()->value_name(util::joinHumanReadable(g_metadataHashArgs, ",")), | ||||
| @ -922,6 +928,7 @@ void CommandLineParser::processArgs() | ||||
| 		{g_strExperimentalViaIR, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, | ||||
| 		{g_strViaIR, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, | ||||
| 		{g_strMetadataLiteral, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, | ||||
| 		{g_strNoCBORMetadata, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, | ||||
| 		{g_strMetadataHash, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, | ||||
| 		{g_strModelCheckerShowUnproved, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, | ||||
| 		{g_strModelCheckerDivModNoSlacks, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, | ||||
| @ -1221,6 +1228,21 @@ void CommandLineParser::processArgs() | ||||
| 			solThrow(CommandLineValidationError, "Invalid option for --" + g_strMetadataHash + ": " + hashStr); | ||||
| 	} | ||||
| 
 | ||||
| 	if (m_args.count(g_strNoCBORMetadata)) | ||||
| 	{ | ||||
| 		if ( | ||||
| 			m_args.count(g_strMetadataHash) && | ||||
| 			m_options.metadata.hash != CompilerStack::MetadataHash::None | ||||
| 		) | ||||
| 			solThrow( | ||||
| 				CommandLineValidationError, | ||||
| 				"Cannot specify a metadata hashing method when --" + | ||||
| 				g_strNoCBORMetadata + " is set." | ||||
| 			); | ||||
| 
 | ||||
| 		m_options.metadata.format = CompilerStack::MetadataFormat::NoMetadata; | ||||
| 	} | ||||
| 
 | ||||
| 	if (m_args.count(g_strModelCheckerContracts)) | ||||
| 	{ | ||||
| 		string contractsStr = m_args[g_strModelCheckerContracts].as<string>(); | ||||
|  | ||||
| @ -215,6 +215,7 @@ struct CommandLineOptions | ||||
| 
 | ||||
| 	struct | ||||
| 	{ | ||||
| 		CompilerStack::MetadataFormat format = CompilerStack::defaultMetadataFormat(); | ||||
| 		CompilerStack::MetadataHash hash = CompilerStack::MetadataHash::IPFS; | ||||
| 		bool literalSources = false; | ||||
| 	} metadata; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user