From 2e816967d315185b930e3460d822f04bff061492 Mon Sep 17 00:00:00 2001 From: Edward Ruchevits Date: Tue, 13 Jun 2017 17:02:57 +0100 Subject: [PATCH 1/3] Allow including hashes of method signatures in --combined-json output --- libsolidity/interface/CompilerStack.cpp | 8 ++++++++ libsolidity/interface/CompilerStack.h | 3 +++ solc/CommandLineInterface.cpp | 3 +++ 3 files changed, 14 insertions(+) diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index aca9ce39e..234539ea6 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -481,6 +481,14 @@ Json::Value const& CompilerStack::natspec(Contract const& _contract, Documentati return *(*doc); } +Json::Value CompilerStack::functionHashes(ContractDefinition const& _contract) +{ + Json::Value functionHashes(Json::objectValue); + for (auto const& it: _contract.interfaceFunctions()) + functionHashes[toHex(it.first.ref())] = it.second->externalSignature(); + return functionHashes; +} + string const& CompilerStack::onChainMetadata(string const& _contractName) const { if (m_stackState != CompilationSuccessful) diff --git a/libsolidity/interface/CompilerStack.h b/libsolidity/interface/CompilerStack.h index bffdeabd4..3250429b6 100644 --- a/libsolidity/interface/CompilerStack.h +++ b/libsolidity/interface/CompilerStack.h @@ -177,6 +177,9 @@ public: /// @param type The type of the documentation to get. /// Can be one of 4 types defined at @c DocumentationType Json::Value const& natspec(std::string const& _contractName, DocumentationType _type) const; + + Json::Value functionHashes(ContractDefinition const& _contract); + std::string const& onChainMetadata(std::string const& _contractName) const; void useMetadataLiteralSources(bool _metadataLiteralSources) { m_metadataLiteralSources = _metadataLiteralSources; } diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index cae05b18c..4fbd3384d 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -165,6 +165,7 @@ static set const g_combinedJsonArgs g_strNatspecUser, g_strNatspecDev, g_strOpcodes, + g_strSignatureHashes, g_strSrcMap, g_strSrcMapRuntime }; @@ -887,6 +888,8 @@ void CommandLineInterface::handleCombinedJSON() auto map = m_compiler->runtimeSourceMapping(contractName); contractData[g_strSrcMapRuntime] = map ? *map : ""; } + if (requests.count(g_strSignatureHashes)) + contractData[g_strSignatureHashes] = m_compiler->functionHashes(m_compiler->contractDefinition(contractName)); if (requests.count(g_strNatspecDev)) contractData[g_strNatspecDev] = dev::jsonCompactPrint(m_compiler->natspec(contractName, DocumentationType::NatspecDev)); if (requests.count(g_strNatspecUser)) From 7c7df6f38b4943e17d2443bfbf6db393e837e6c7 Mon Sep 17 00:00:00 2001 From: Edward Ruchevits Date: Tue, 13 Jun 2017 17:11:15 +0100 Subject: [PATCH 2/3] Removed duplicate code --- solc/jsonCompiler.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/solc/jsonCompiler.cpp b/solc/jsonCompiler.cpp index 1505a43d6..87b97efb2 100644 --- a/solc/jsonCompiler.cpp +++ b/solc/jsonCompiler.cpp @@ -86,14 +86,6 @@ ReadFile::Callback wrapReadCallback(CStyleReadFileCallback _readCallback = nullp return readCallback; } -Json::Value functionHashes(ContractDefinition const& _contract) -{ - Json::Value functionHashes(Json::objectValue); - for (auto const& it: _contract.interfaceFunctions()) - functionHashes[it.second->externalSignature()] = toHex(it.first.ref()); - return functionHashes; -} - /// Translates a gas value as a string to a JSON number or null Json::Value gasToJson(Json::Value const& _value) { @@ -198,7 +190,7 @@ string compile(StringMap const& _sources, bool _optimize, CStyleReadFileCallback contractData["runtimeBytecode"] = compiler.runtimeObject(contractName).toHex(); contractData["opcodes"] = solidity::disassemble(compiler.object(contractName).bytecode); contractData["metadata"] = compiler.onChainMetadata(contractName); - contractData["functionHashes"] = functionHashes(compiler.contractDefinition(contractName)); + contractData["functionHashes"] = compiler.functionHashes(compiler.contractDefinition(contractName)); contractData["gasEstimates"] = estimateGas(compiler, contractName); auto sourceMap = compiler.sourceMapping(contractName); contractData["srcmap"] = sourceMap ? *sourceMap : ""; From 5f7bca94e5174738aea294c51f4bea2f8b450d0d Mon Sep 17 00:00:00 2001 From: Edward Ruchevits Date: Tue, 13 Jun 2017 18:04:33 +0100 Subject: [PATCH 3/3] Reverted functionHashes output to use method signature as keys --- libsolidity/interface/CompilerStack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 234539ea6..b09108b0b 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -485,7 +485,7 @@ Json::Value CompilerStack::functionHashes(ContractDefinition const& _contract) { Json::Value functionHashes(Json::objectValue); for (auto const& it: _contract.interfaceFunctions()) - functionHashes[toHex(it.first.ref())] = it.second->externalSignature(); + functionHashes[it.second->externalSignature()] = toHex(it.first.ref()); return functionHashes; }