Trufa desarrollar obtener una nueva instancia de contrato de la dirección del contrato

Desde una truffle developconsola, ¿hay alguna forma de obtener la instancia del contrato desde la dirección del contrato?

Tengo un ec2 remoto con truffle/geth instalado y una instancia de desarrollo de truffle en ejecución. Desde una truffle developconsola local, he implementado mis contratos en esa red remota (usando el truffle migrate --compile-all --reset --network remote_network_name). Los contratos se implementaron con éxito y tengo una dirección donde se almacena el contrato.

En una truffle developconsola en el servidor remoto, he intentado Contract_Name.deployed().then(function(instance) {app = instance; })obtener la instancia, pero obtengo un Contract_Name is undefinederror.

Desde una truffle developconsola en el servidor remoto, ¿hay alguna forma de obtener la instancia del contrato desde la dirección del contrato?

¿ Quizás algo como MyContract = new Contract.at("ContractAddress")?

¿La instancia remota tiene el código fuente de sus contratos? Si el código fuente está disponible, puede intentar copiar el build/directorio con los artefactos de implementación en el servidor remoto.
Gracias Ismael. Las instancias remotas no tienen el código fuente de mis contratos y me gustaría evitar copiar mi carpeta de compilación en el servidor. Por ejemplo, si implementé estos contratos en una red de prueba y no tengo acceso para cargar archivos dentro de ese servidor, ¿hay alguna manera de obtener la instancia del contrato desde la dirección del contrato? ¿Es esto posible sin copiar la carpeta de compilación? ¿O Truffle necesita la carpeta de compilación para hacer referencia a las ABI del contrato?
Dentro del directorio build/ hay un archivo .json para cada contrato, dentro de ese archivo está la ABI del contrato y la dirección de implementación. Eso debería ser suficiente para obtener la instancia implementada. Tal vez pueda usar algo como github.com/trufflesuite/truffle-artifactor para envolver el artefacto en una clase de javascript que se puede usar sin copiar todo el directorio.

Respuestas (3)

Hay una manera mucho más fácil cuando se usa trufa.

Primero incluye el artefacto del contrato, igual que cuando creas un nuevo contrato en truffle.

let MiContrato = artefactos.require("./MiContrato.sol");

luego en script:

let myContract = await MyContract.at('dirección de mi contrato');

De esta manera, no es necesario tomar el ABI de otro archivo, etc.

La respuesta de Daniel es la forma estándar, pero esta forma es necesaria si el contrato que desea es generado por otro contrato. Gracias.

Personalmente, en Truffle, prefiero no tener que saber o necesitar la dirección de mi contrato implementado para obtener su instancia. Es posible que no recuerde la dirección de su contrato o que la dirección haya quedado enterrada en lo profundo de la terminal a medida que los nuevos contenidos empujan a los viejos hacia arriba.
El camino a seguir para obtener una instancia de contrato implementada sin conocer la dirección del contrato es usar el deployed()método del contrato de la siguiente manera:

const deployedContractInstance = await MyContract.deployed()

¡Y eso es!

Ahora tiene acceso a todos los atributos y métodos que expone su contrato, por ejemplo, puede obtener la dirección simplemente haciendo deployedContractInstance.address.

Realmente gran respuesta! No solo explica la razón por la que prefiere este enfoque, sino que también incluye el código y el ejemplo relevantes en una respuesta muy concisa.

¡Resuelto! Necesita dos cosas para obtener la instancia de un contrato en una red remota:

  1. La ABI de su contrato : después de implementar su contrato en la red remota ejecutándolo truffle migrate --compile-all --reset --network remote_network_nameen su consola de desarrollo de truffle local, Truffle creará una representación de objeto json de su contrato en su build/directorio local. Dentro de ese objeto json, puede encontrar la matriz ABI de su contrato.
  2. La dirección de su contrato : después de implementar su contrato en la red remota, la dirección de su contrato se mostrará en su consola de desarrollo de trufas local de la siguiente manera:

Captura de pantalla de la consola de desarrollo de Truffle


Con esos dos datos, puede ingresar a su consola de desarrollo de trufas en el servidor remoto y obtener una instancia de su contrato a través de estos comandos:

  1. var MyContract = new web3.eth.Contract(abiArray);
  2. var contractInstance = await MyContract.at(contractAddress);

NOTA: esto supone que está utilizando web3.js versión 0.2xx. Si está utilizando web3.js 1.0, consulte esta documentación .