Llamar a los comandos de Truffle a través de un script

Hice el siguiente contrato usando el código de Visual Studio

pragma solidity ^0.4.17;

contract IDSCheck {

    mapping( string => string ) PersonHash;

    function AddHash(string name, string hash) {
        PersonHash[name] = hash;

    }

    function GetHash (string name) public returns (string) {
        return PersonHash[name];
    }
}

Ahora quiero llamar a esta función desde truffle usando el comando exec.

Escribí un archivo js llamado idscheck.js con los siguientes comandos

var IDSCheck = artifacts.require("./IDSCheck.sol");
module.exports = function (deployer) {
  var ss;
  IDSCheck.deployed().then(function(deployed){ ss=deployed; });
  ss.GetHash.call("sal");
}

Recibo un error de salida que dice

Error de tipo: no se puede leer la propiedad 'GetHash' de undefined en .....

Estoy tratando de hacer esto en la consola de trufas. El objetivo principal es crear un script que se ejecute a través de un archivo por lotes utilizando la consola truffle para obtener el resultado de la función GetHash del contrato anterior.

Respuestas (2)

Su problema es el comportamiento asíncrono de la promesa devuelta por IDSCheck.deployed(). Es posible que la variable ssno se inicialice si llama ss.GetHash()inmediatamente después.

Puede solucionarlo ejecutando la llamada después de estar seguro de que se inicializó correctamente dentro de la .then()función.

var IDSCheck = artifacts.require("./IDSCheck.sol");
module.exports = function (callback) {
  var ss;
  IDSCheck.deployed().then(function(deployed){
    ss = deployed;
    // Here we are sure `ss` is initialized and it is safe to call `.GetHash()`
    ss.GetHash.call("sal");
  });
  // This code 'might' be excuted before the code inside `.then()`
  // ss.GetHash.call("sal");
}

Cambia esto:

var IDSCheck = artifacts.require("./IDSCheck.sol");

A esto:

var IDSCheck = artifacts.require("./IDSCheck.sol").new();
Cambié pero ahora aparece un nuevo error .. TypeError: IDSCheck.deployed no es una función