Use hash for library placeholders.

This commit is contained in:
chriseth
2018-10-12 15:15:01 +02:00
parent 5f5dc8956d
commit 6daeb39ecc
7 changed files with 69 additions and 9 deletions
+8 -2
View File
@@ -21,6 +21,7 @@
#include <libevmasm/LinkerObject.h>
#include <libdevcore/CommonData.h>
#include <libdevcore/SHA3.h>
using namespace dev;
using namespace dev::eth;
@@ -50,14 +51,19 @@ string LinkerObject::toHex() const
for (auto const& ref: linkReferences)
{
size_t pos = ref.first * 2;
string const& name = ref.second;
string hash = libraryPlaceholder(ref.second);
hex[pos] = hex[pos + 1] = hex[pos + 38] = hex[pos + 39] = '_';
for (size_t i = 0; i < 36; ++i)
hex[pos + 2 + i] = i < name.size() ? name[i] : '_';
hex[pos + 2 + i] = hash.at(i);
}
return hex;
}
string LinkerObject::libraryPlaceholder(string const& _libraryName)
{
return keccak256(_libraryName).hex().substr(0, 36);
}
h160 const*
LinkerObject::matchLibrary(
string const& _linkRefName,
+5
View File
@@ -50,6 +50,11 @@ struct LinkerObject
/// addresses by placeholders.
std::string toHex() const;
/// @returns a 36 character string that is used as a placeholder for the library
/// address (enclosed by `__` on both sides). The placeholder is the hex representation
/// of the first 18 bytes of the keccak-256 hash of @a _libraryName.
static std::string libraryPlaceholder(std::string const& _libraryName);
private:
static h160 const* matchLibrary(
std::string const& _linkRefName,