¿Cómo vincula las bibliotecas el compilador en línea solidity?

Supongamos que tengo este código:

import "github.com/Arachnid/solidity-stringutils/strings.sol";

contract Contract {
    using strings for *;

    // ...
}

Para esta solidez, el compilador en línea genera este código de bytes:

60606040523415600b57fe5b5b60338060196000396000f30060606040525bfe00a165627a7a723058207a17f097139e731ad961366b8214b226041a3cd4427248c94ea39ee29bafface0029

Aquí no veo ningún marcador de posición para agregar la dirección de la biblioteca. Pero cuando implemento el código de bytes, crea un contrato con éxito.

Entonces, ¿cómo encuentra el compilador en línea solidity la dirección de la biblioteca?

¿Y cómo sabe dónde implementar la biblioteca, es decir, mainnet o testnet? Puedo usar el mismo código de bytes tanto en la red principal como en la red de prueba, pero la dirección de la biblioteca puede ser diferente en ambas redes. También hay redes privadas.

Respuestas (2)

En este caso, la biblioteca de "cadenas" solo tiene funciones con internalvisibilidad, por lo tanto, todas las funciones de la biblioteca se copian en el Contractcontrato, por lo tanto, la biblioteca de "cadenas" nunca se implementó y, por lo tanto, no hay ningún marcador de posición para agregar la dirección de la biblioteca de "cadenas". en el código de bytes de Contract.

Para saber por qué se copió, lea este http://solidity.readthedocs.io/en/develop/contracts.html#libraries

Supongo que está utilizando https://ethereum.github.io/browser-solidity/ cuando se refiere al "compilador en línea de solidez".

Si ese es el caso, esto es lo que sucede cuando "creas" tu Contract:

  1. genera importuna biblioteca a partir de la fuente de github, la compila, la implementa y mantiene la dirección en la memoria.
  2. El compilador compila su Contract, y luego vincula el código de bytes resultante a la dirección de la biblioteca.
  3. El código de bytes vinculado luego se implementa en la cadena de bloques.

Espero que eso lo aclare. Estoy un poco desactualizado en lo interno del proyecto de solidez del navegador, así que espero no estar desviándote.

Pero, ¿cómo sabe dónde implementar el contrato, es decir, mainnet o testnet? Puedo usar el mismo código de bytes tanto en la red principal como en la red de prueba, pero la dirección de la biblioteca puede ser diferente en ambas redes. También hay redes privadas.
De forma predeterminada, la solidez del navegador se implementa en una máquina virtual de JavaScript en memoria. Si desea implementar una cadena de bloques en vivo, debe alternar la pestaña "cubo", que le permite especificar un punto final de proveedor Web3 a un nodo Ethereum. Independientemente de la red a la que esté conectado el nodo, se implementará el contrato.
Exactamente. Seleccioné VM para la compilación. Pero pude implementar el código del contrato en la red principal y lo probé y funcionó bien. ¿Cómo funcionó cuando nunca se implementó en mainner y testnet?
Lo siento, no entiendo tu pregunta.
El bytecode generado ya contiene la dirección de la biblioteca "strings". Para implementar el contrato en la red principal, necesito reemplazar la dirección, ¿verdad? Para que apunte a la biblioteca de cadenas que está en la red principal. Pero puedo implementar y ejecutar los métodos del contrato con éxito sin cambiar la dirección de la biblioteca de "cadenas". ¿Como es posible?
Una cosa más que noté que sucede solo con la biblioteca de cadenas. Creé una biblioteca propia que mostraba un marcador de posición para poner la dirección. Y también este es el comportamiento del compilador solcjs específicamente.