在 TRON 网络中签署和广播智能合约交易
Sign and broadcast smart contract transaction in TRON network
使用 node.js 客户端,我试图通过以下方式调用智能合约功能:
- 正在创建交易
- 签名
- 广播已签名的交易
我部署了一个简单的智能合约:
pragma solidity ^0.4.25;
contract Test {
event MyEvent(address sender, string message, uint sessionId, uint value);
event TestEvent(address sender);
constructor() public {
}
function testFunction(string message, uint sessionId)
public
payable {
emit MyEvent(msg.sender, message, sessionId, msg.value);
}
function test2()
public {
emit TestEvent(msg.sender);
}
}
我成功调用了 test2
(发送空参数数组时),但无法调用带参数的 testFunction
。
我试过使用 tronweb triggerSmartContract call:
async function triggerSmartContract() {
try {
const options = {
feeLimit: 1000000000,
callValue: 50
};
const parameters = [{type: 'string', value: 'test-round-id-1'}, {type: 'uint', value: 12345}];
const issuerAddress = tronWeb.defaultAddress.base58;
const functionSelector = 'testFunction(string, uint)';
let transactionObject = await tronWeb.transactionBuilder.triggerSmartContract (
contract_address,
functionSelector,
options,
parameters,
tronWeb.address.toHex(issuerAddress)
);
if (!transactionObject.result || !transactionObject.result.result)
return console.error('Unknown error: ' + txJson, null, 2);
// Signing the transaction
const signedTransaction = await tronWeb.trx.sign(transactionObject.transaction);
if (!signedTransaction.signature) {
return console.error('Transaction was not signed properly');
}
// Broadcasting the transaction
const broadcast = await tronWeb.trx.sendRawTransaction(signedTransaction);
console.log(`broadcast: ${broadcast}`);
} catch (e) {
return console.error(e);
}
}
代码运行并在区块链上创建交易,但结果为 FAIL-REVERT OPCODE EXECUTED
。
tronweb 对象中定义的地址和密钥的钱包中有足够的资金(这不是 gas/not 足够的资金问题)。
另外智能合约中的函数定义为payable
因为我可以成功调用任何没有参数的函数,所以我倾向于认为问题与我构建 parameters
数组的方式有关。在遍历 source code of the transactionBuilder (line 833).
之后,我以这种方式构建了 parameters
数组(type
和 value
对)
有什么建议吗?
尝试在不带空格的情况下编写函数参数。const functionSelector = 'testFunction(string,uint)';
我在文档中读到您必须在不带空格的情况下编写,它在 python 上对我有用。
有完全相同的问题。解决方案:
- 按照 malysh 的建议删除
const functionSelector = 'testFunction(string,uint)';
中的空格
- 将
uint
更改为uint256
使用 node.js 客户端,我试图通过以下方式调用智能合约功能:
- 正在创建交易
- 签名
- 广播已签名的交易
我部署了一个简单的智能合约:
pragma solidity ^0.4.25;
contract Test {
event MyEvent(address sender, string message, uint sessionId, uint value);
event TestEvent(address sender);
constructor() public {
}
function testFunction(string message, uint sessionId)
public
payable {
emit MyEvent(msg.sender, message, sessionId, msg.value);
}
function test2()
public {
emit TestEvent(msg.sender);
}
}
我成功调用了 test2
(发送空参数数组时),但无法调用带参数的 testFunction
。
我试过使用 tronweb triggerSmartContract call:
async function triggerSmartContract() {
try {
const options = {
feeLimit: 1000000000,
callValue: 50
};
const parameters = [{type: 'string', value: 'test-round-id-1'}, {type: 'uint', value: 12345}];
const issuerAddress = tronWeb.defaultAddress.base58;
const functionSelector = 'testFunction(string, uint)';
let transactionObject = await tronWeb.transactionBuilder.triggerSmartContract (
contract_address,
functionSelector,
options,
parameters,
tronWeb.address.toHex(issuerAddress)
);
if (!transactionObject.result || !transactionObject.result.result)
return console.error('Unknown error: ' + txJson, null, 2);
// Signing the transaction
const signedTransaction = await tronWeb.trx.sign(transactionObject.transaction);
if (!signedTransaction.signature) {
return console.error('Transaction was not signed properly');
}
// Broadcasting the transaction
const broadcast = await tronWeb.trx.sendRawTransaction(signedTransaction);
console.log(`broadcast: ${broadcast}`);
} catch (e) {
return console.error(e);
}
}
代码运行并在区块链上创建交易,但结果为 FAIL-REVERT OPCODE EXECUTED
。
tronweb 对象中定义的地址和密钥的钱包中有足够的资金(这不是 gas/not 足够的资金问题)。
另外智能合约中的函数定义为payable
因为我可以成功调用任何没有参数的函数,所以我倾向于认为问题与我构建 parameters
数组的方式有关。在遍历 source code of the transactionBuilder (line 833).
parameters
数组(type
和 value
对)
有什么建议吗?
尝试在不带空格的情况下编写函数参数。const functionSelector = 'testFunction(string,uint)';
我在文档中读到您必须在不带空格的情况下编写,它在 python 上对我有用。
有完全相同的问题。解决方案:
- 按照 malysh 的建议删除
const functionSelector = 'testFunction(string,uint)';
中的空格 - 将
uint
更改为uint256