我使用示例 solidity 代码教程创建了一个合约代币。它有一个称为转账的函数,用于在帐户之间发送令牌:
function transfer(address _to, uint256 _value)
我现在需要使用 web3 连接到此合约,然后将生成的一定数量的代币发送到另一个帐户。很长一段时间以来,我一直在为如何做到这一点而苦苦挣扎,并希望这个社区可以提供帮助。以下是我迄今为止使用 web3 版本 0.20.0 的内容:
const Web3 = require("web3");
const web3 = new Web3();
web3.setProvider(new
web3.providers.HttpProvider("https://ropsten.infura.io/XXXXXX"));
var abi = [ {} ] // redacted on purpose
var count = web3.eth.getTransactionCount("0x9...");
var abiArray = abi;
var contractAddress = "0x2...";
var contract = web3.eth.contract(abiArray).at(contractAddress);
var data = contract.transfer.getData("0x2...", 10000, {from: "0x9..."});
var gasPrice = web3.eth.gasPrice;
var gasLimit = 90000;
var rawTransaction = {
"from": "0x9...",
"nonce": web3.toHex(count),
"gasPrice": web3.toHex(gasPrice),
"gasLimit": web3.toHex(gasLimit),
"to": "0x2...",
"value": "0x1",
"data": data,
"chainId": 0x03
};
var privKey = new Buffer('XXXXXXXXXXXXXX', 'hex');
var tx = new Tx(rawTransaction);
tx.sign(privKey);
var serializedTx = tx.serialize();
web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {
if (!err)
console.log(hash);
else
console.log(err);
});
此交易有效,但它发送以太币而不是实际的 ERC20 代币。我真的很不明白为什么会这样,并希望得到任何帮助。
这可能会晚了,但对于未来的用户来说。您发送以太币代替代币的原因是,在价值的原始交易字段中,您输入了"0x1"。要发送ERC20令牌,您应该将其保留在"0x0"。
如果您只在发送以太币时遇到问题,确保将原始事务对象中的 value
属性作为"0x0"
并在 to
属性中输入智能合约地址,如下所示:
var rawTransaction = {
"from": "0x9...",
"nonce": web3.toHex(count),
"gasPrice": web3.toHex(gasPrice),
"gasLimit": web3.toHex(gasLimit),
"to": "<contract Address>",
"value": "0x0",
"data": data,
"chainId": 0x03
};
如果您仍然遇到问题,请阅读以下内容以查看我发送erc20令牌的运行版本:
创建合约实例时,在选项中添加from
属性,如下所示:
var contract = new web3.eth.Contract(erc20ABI, contractAddress, {
from: '<Address from where you are spending>'
});
其次,在创建原始事务的data
部分时,请执行以下操作:
var data = contract.methods.transfer('<Toaddress>', amount)).encodeABI();
现在,您可以按照与将交易广播到网络相同的步骤进行操作。