加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

智能合约开发遇到的坑

(2018-07-23 09:30:01)
分类: 前端总结
网上搜索的资料写的很详细啊,可试验啊试验,始终不成功,

使用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

阅读 收藏 喜欢 打印举报/Report
前一篇:vuedemo
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有