¿Cómo compilo un contrato de Solidity con una importación a un código de bytes independiente?

Estoy tratando de compilar el contrato MetaCoin (parte del paquete web Truffle Init ). Necesito obtener el código de bytes como números hexadecimales para poder usarlo con Nethereum. La MetaCoin contiene una importación a ConvertLib.sol:

pragma solidity ^0.4.4;

import "./ConvertLib.sol";

contract MetaCoin {
    ...

Cuando lo compilo (usando Truffle desde la línea de comando o la extensión Solidity para VS Code), el código de bytes que obtengo es:

0x6060 ... 0073__ConvertLib____________________________6396 ... 0029

Obviamente, esta es una referencia a la biblioteca ConvertLib. Cuando uso Nethereum para intentar implementar el contrato:

...
var ByteCode = 
    "0x6060 ... 0073__ConvertLib____________________________6396 ... 0029";
var transactionHash = await web3.Eth.DeployContract.SendRequestAsync(
    Abi, ByteCode, Address, Gas, GasPrice);

Recibo el mensaje de error:

System.InvalidOperationException: Character '_' at index '604' is not valid alphanumeric character.

Claramente, no le gusta la referencia "ConvertLib" en medio del código de bytes. Podría simplemente incluir el código de la biblioteca en el contrato MetaCoin y eliminar la importación, pero me gustaría resolver este problema correctamente.

¿Cómo puedo compilar el contrato MetaCoin para que incluya la biblioteca ConvertLib en el código de bytes?

Respuestas (1)

lo que buscas es

solc --optimize --bin MetaCoin.sol | solc --link --libraries ConvertLib:<address>

Para que esto funcione ConvertLib, primero debe implementarse, el enlace luego reemplazará los marcadores de posición como 0073__ConvertLib____________________________6396con las direcciones reales.

Para citar la parte pertinente de la documentación :

Si sus contratos usan bibliotecas, notará que el código de bytes contiene subcadenas de la forma __LibraryName______. Puede usar solc como un enlazador, lo que significa que insertará las direcciones de la biblioteca en esos puntos:

Agregue --libraries "Math:0x12345678901234567890 Heap:0xabcdef0123456"a su comando para proporcionar una dirección para cada biblioteca o almacene la cadena en un archivo (una biblioteca por línea) y ejecútelo solcusando --libraries fileName.

Si solcse llama con la opción --link, todos los archivos de entrada se interpretan como binarios no vinculados (codificados en hexadecimal) en el formato __LibraryName____ dado anteriormente y se vinculan en el lugar (si la entrada se lee desde stdin, se escribe en salida estándar). Todas las opciones, excepto --libraries, se ignoran (incluido -o) en este caso.

Ah, ya veo. No me di cuenta de que los contratos de ConvertLib y MetaCoin se implementarían en la cadena de bloques por separado. Interesante - gracias por eso.