mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Use hash for library placeholders.
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user