
网上搜索的资料写的很详细啊,可试验啊试验,始终不成功,
使用Web3.js查询以太币和代币余额以及转账 https://www.jianshu.com/p/496c9d833df9 不用自己同步以太坊节点,直接发起签名交易 https://segmentfault.com/a/1190000014729677 以太坊ERC20 Token标准完整说明 https://blog.csdn.net/diandianxiyu_geek/article/details/78082551?utm_source=gold_browser_extension 最后发现,问题所在是因为网上的资料大部分都是针对私链的,而公链的转账是不一样的。。。啊。。。花费了两天的时间才试验出来 var myContract = new web3.eth.Contract(apiInterface, contractAddress); // console.log(myContract.methods) //合约查询账户余额 myContract.methods.balanceOf(currentAccount).call().then(data => { console.log('from balance:' + data) }) //合约转账 var txData = { to: contractAddress, value: web3.utils.toWei('0','ether'),//合约转账时,此值需设为0 gas: this.chainGas, gasPrice: this.gasPrice, nonce: nonce, chainId: this.chainID, data: myContract.methods.transfer(toAddress, 10000).encodeABI(), } web3.eth.accounts.signTransaction(txData, this.curAccount.decryptKey.privateKey) .then((data)=>{ web3.eth.sendSignedTransaction(data.rawTransaction) .on('transactionHash', (data)=>{ console.log('ok') }) .catch((data)=>{ console.log(data) }) }) 最后附上大神的私链代码供参考: router.post('/transfer/token/sign.json', function (req, res) { const from = req.body.from; const to = req.body.to; const symbol = req.body.symbol; const key = req.body.key; var message = {}; try{ const abi = fs.readFileSync( __dirname + '/abi/'+symbol+'.abi', 'utf-8'); const contractAddress = contracts[symbol]; const contract = new web3.eth.Contract(JSON.parse(abi), contractAddress, { "from": from}); contract.methods.balanceOf(from).call().then(function(balance){ contract.methods.decimals().call().then(function(decimals){ const amount = new BigNumber(req.body.amount).toFixed(Number(decimals)).toString().replace(".",""); if(Number(amount) > Number(balance)){ message = {"status": false, "code":1, "data":{"error":"balance = " + balance}}; logger.error(message); res.json(message); return; } web3.eth.getGasPrice().then(function(gasPrice){ var price = Number(gasPrice); web3.eth.getTransactionCount(from).then(function(nonce){ contract.methods.transfer(from, amount).estimateGas().then(function(gas){ var rawTransaction = { "nonce": web3.utils.toHex(nonce), "from": from, "to": contractAddress, "gas": web3.utils.toHex(gas), "gasPrice": web3.utils.toHex(price), // "gasLimit": this.web3.utils.toHex(gasLimit.gasLimit), "value": "0x0", "data": contract.methods.transfer(to, amount).encodeABI() }; // console.log(`balance: ${balance}`); // console.log(price); // console.log(gas); // console.log(amount); // console.log(rawTransaction); logger.debug(`/transfer/token/sign.json - gas: ${gas}, price: ${price}, cost: ${gas * price}, balance: ${balance}, amount: ${amount}, value: ${value}`); // console.log(rawTransaction); var privateKey = new Buffer.from(key, 'hex'); var tx = new Tx(rawTransaction); tx.sign(privateKey); var serializedTx = tx.serialize(); web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')).on('receipt', function(txhash){ message = {"status":true, "code":0, "data":{"txhash":txhash}}; logger.info(message); res.json(message); }); }); }); }); }); }); }catch(error){ message = {"status": false, "code":1, "data":{"error":error.message}}; logger.error(message); res.json(message); }; });欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)