Create option for metadata hash

This commit is contained in:
Leonardo Alt
2019-09-13 18:59:12 +02:00
parent c72d1ffb65
commit d685554980
22 changed files with 272 additions and 117 deletions
+23 -1
View File
@@ -159,6 +159,13 @@ void CompilerStack::useMetadataLiteralSources(bool _metadataLiteralSources)
m_metadataLiteralSources = _metadataLiteralSources;
}
void CompilerStack::setMetadataHash(MetadataHash _metadataHash)
{
if (m_stackState >= ParsingPerformed)
BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Must set metadata hash before parsing."));
m_metadataHash = _metadataHash;
}
void CompilerStack::addSMTLib2Response(h256 const& _hash, string const& _response)
{
if (m_stackState >= ParsingPerformed)
@@ -182,6 +189,7 @@ void CompilerStack::reset(bool _keepSettings)
m_generateEWasm = false;
m_optimiserSettings = OptimiserSettings::minimal();
m_metadataLiteralSources = false;
m_metadataHash = MetadataHash::IPFS;
}
m_globalContext.reset();
m_scopes.clear();
@@ -1155,6 +1163,10 @@ string CompilerStack::createMetadata(Contract const& _contract) const
if (m_metadataLiteralSources)
meta["settings"]["metadata"]["useLiteralContent"] = true;
static vector<string> hashes{"ipfs", "bzzr1", "none"};
meta["settings"]["metadata"]["bytecodeHash"] = hashes.at(unsigned(m_metadataHash));
meta["settings"]["evmVersion"] = m_evmVersion.name();
meta["settings"]["compilationTarget"][_contract.contract->sourceUnitName()] =
_contract.contract->annotation().canonicalName;
@@ -1263,7 +1275,17 @@ private:
bytes CompilerStack::createCBORMetadata(string const& _metadata, bool _experimentalMode)
{
MetadataCBOREncoder encoder;
encoder.pushBytes("bzzr1", dev::bzzr1Hash(_metadata).asBytes());
if (m_metadataHash == MetadataHash::IPFS)
{
solAssert(_metadata.length() < 1024 * 256, "Metadata too large.");
encoder.pushBytes("ipfs", dev::ipfsHash(_metadata));
}
else if (m_metadataHash == MetadataHash::Bzzr1)
encoder.pushBytes("bzzr1", dev::bzzr1Hash(_metadata).asBytes());
else
solAssert(m_metadataHash == MetadataHash::None, "Invalid metadata hash");
if (_experimentalMode)
encoder.pushBool("experimental", true);
if (m_release)
+12
View File
@@ -92,6 +92,12 @@ public:
CompilationSuccessful
};
enum class MetadataHash {
IPFS,
Bzzr1,
None
};
struct Remapping
{
std::string context;
@@ -171,6 +177,11 @@ public:
/// Must be set before parsing.
void useMetadataLiteralSources(bool _metadataLiteralSources);
/// Sets whether and which hash should be used
/// to store the metadata in the bytecode.
/// @param _metadataHash can be IPFS, Bzzr1, None
void setMetadataHash(MetadataHash _metadataHash);
/// Sets the sources. Must be set before parsing.
void setSources(StringMap _sources);
@@ -418,6 +429,7 @@ private:
langutil::ErrorList m_errorList;
langutil::ErrorReporter m_errorReporter;
bool m_metadataLiteralSources = false;
MetadataHash m_metadataHash = MetadataHash::IPFS;
bool m_parserErrorRecovery = false;
State m_stackState = Empty;
/// Whether or not there has been an error during processing.
+21 -3
View File
@@ -378,9 +378,16 @@ boost::optional<Json::Value> checkOptimizerDetail(Json::Value const& _details, s
boost::optional<Json::Value> checkMetadataKeys(Json::Value const& _input)
{
if (_input.isObject() && _input.isMember("useLiteralContent") && !_input["useLiteralContent"].isBool())
return formatFatalError("JSONError", "\"settings.metadata.useLiteralContent\" must be Boolean");
static set<string> keys{"useLiteralContent"};
if (_input.isObject())
{
if (_input.isMember("useLiteralContent") && !_input["useLiteralContent"].isBool())
return formatFatalError("JSONError", "\"settings.metadata.useLiteralContent\" must be Boolean");
static set<string> hashes{"ipfs", "bzzr1", "none"};
if (_input.isMember("bytecodeHash") && !hashes.count(_input["bytecodeHash"].asString()))
return formatFatalError("JSONError", "\"settings.metadata.bytecodeHash\" must be \"ipfs\", \"bzzr1\" or \"none\"");
}
static set<string> keys{"useLiteralContent", "bytecodeHash"};
return checkKeys(_input, keys, "settings.metadata");
}
@@ -710,6 +717,16 @@ boost::variant<StandardCompiler::InputsAndSettings, Json::Value> StandardCompile
return *result;
ret.metadataLiteralSources = metadataSettings.get("useLiteralContent", Json::Value(false)).asBool();
if (metadataSettings.isMember("bytecodeHash"))
{
auto metadataHash = metadataSettings["bytecodeHash"].asString();
ret.metadataHash =
metadataHash == "ipfs" ?
CompilerStack::MetadataHash::IPFS :
metadataHash == "bzzr1" ?
CompilerStack::MetadataHash::Bzzr1 :
CompilerStack::MetadataHash::None;
}
Json::Value outputSelection = settings.get("outputSelection", Json::Value());
@@ -735,6 +752,7 @@ Json::Value StandardCompiler::compileSolidity(StandardCompiler::InputsAndSetting
compilerStack.setOptimiserSettings(std::move(_inputsAndSettings.optimiserSettings));
compilerStack.setLibraries(_inputsAndSettings.libraries);
compilerStack.useMetadataLiteralSources(_inputsAndSettings.metadataLiteralSources);
compilerStack.setMetadataHash(_inputsAndSettings.metadataHash);
compilerStack.setRequestedContractNames(requestedContractNames(_inputsAndSettings.outputSelection));
compilerStack.enableIRGeneration(isIRRequested(_inputsAndSettings.outputSelection));
+1
View File
@@ -68,6 +68,7 @@ private:
OptimiserSettings optimiserSettings = OptimiserSettings::minimal();
std::map<std::string, h160> libraries;
bool metadataLiteralSources = false;
CompilerStack::MetadataHash metadataHash = CompilerStack::MetadataHash::IPFS;
Json::Value outputSelection;
};