首页 > 解决方案 > 将 js var 传递给 solidity 函数

问题描述

在solidity中写了一个这样的函数,

function AddData(uint _index, string _projectName, string _devAddress, string _developer) public {
    Datas[_index] = Data(_index, 0, _projectName, _devAddress, _developer);
}

请注意,这只是整个 Solidity 代码的一部分。在 js 中,我试图将变量传递给函数,但似乎没有工作。我认为这是js变量无法传递给solidity字符串变量。

counterDB.AddData(id_db, projectName, devAddress, developer, function (err, result) {
     if (err) {
         console.log('Error: ' + err);
     }
     else {
         console.log(result);
     }
});

传入的变量是我从数据库中提取并传入智能合约的数据。我检查了每个数据都已正确提取,但我无法将数据传递到函数中。我是否缺少将 var 转换为字符串的函数?

标签: javascriptsoliditysmartcontracts

解决方案


您使用的是 web3 v1.0 吗?您是否尝试过像这样传递函数:

var yourContract = new web3.eth.Contract(ABI, contractAddress);
const contractFunction = yourContract.methods.AddData(id_db, projectName, devAddress, developer);
const functionBytes = contractFunction.encodeABI();

const rawTx = {
    gasLimit: web3.utils.toHex(200000),
    to: contractAddress,
    from: addressFrom,
    data: functionBytes
    };

web3.eth.accounts.signTransaction(rawTx, privateKey)
    .then(RLPencodedTx => {

    web3.eth.sendSignedTransaction(RLPencodedTx['rawTransaction'])
    .on('error', error => { callback(null, error) })
    .on('receipt', receipt => { callback(receipt) });

})

请记住,如果您使用它的 json 导出,则必须解密私钥:

var path = process.cwd();
const exportedAccountString = fs.readFileSync(path + '/your_key_file.json').toString();
const decrypted = web3.eth.accounts.decrypt(exportedAccountString, 'YourPasswordHere...');
const privateKey = decrypted.privateKey;

推荐阅读