首页 > 解决方案 > 智能合约在 remix 上正常工作,但在 web3 上不能正常工作

问题描述

我的智能合约有问题。

调用该方法时,从元币合约转账以将代币发送到另一个合约。

当我尝试从 getAddress 函数中读取数据时,显示全零。

从 Remix IDE 调用传输函数时,从 getAddress 函数读取后,它会正确返回地址。

Web3 版本 0.20.6

松露版 v4.1.13

Geth 版本 1.8.12

元币合约:

pragma solidity ^0.4.4;

import "./ERC223_interface.sol";
import "./SafeMath.sol";
import "./ERC223_receiving_contract.sol";
import "./ERC20_interface.sol";

//ERC223Interface

contract MetaCoin is ERC20Interface, ERC223Interface { 
    using SafeMath for uint;

    string public constant symbol = "MC";
    string public constant name = "MetaCoin";
    uint256 public constant decimals = 18;

    uint256 private constant _totalSupply = 1000000;

    address private _owner;


    mapping(address => uint) private balances;

    mapping(address => mapping(address => uint)) private allowed;

    constructor() public{
        _owner = msg.sender;
        balances[_owner] = _totalSupply;
        emit Transfer(address(0), _owner, _totalSupply);
    }

    function totalSupply() public view returns (uint) {
        return _totalSupply;
    }

    function balanceOf(address takeOwner) public view returns (uint balance){
        return balances[takeOwner];

    }

    function allowance(address tokenOwner, address spender) public view returns (uint remaining) {
        return allowed[tokenOwner][spender];

    }

    function transfer(address to, uint tokens) public returns (bool success){
        if(tokens <= balanceOf(msg.sender) && tokens>0 && !checkContract(to)){
            balances[msg.sender] = balances[msg.sender].sub(tokens);
            balances[to] = balances[to].add(tokens);
            emit Transfer(msg.sender, to, tokens);
            return true;

        }

        return false;



    }

    function approve(address spender,uint tokens) public returns(bool success){
        allowed[msg.sender][spender] = tokens;
        emit Approval(msg.sender, spender, tokens);
        return true;

    }

    function transferFrom(address from, address to, uint tokens) public returns (bool success){
        if(allowed[from][msg.sender] > 0 &&
            tokens > 0 && 
            allowed[from][msg.sender] >= tokens && 
            balances[from]>=tokens){


            balances[from] = balances[from].sub(tokens);
            allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);
            balances[to] = balances[to].add(tokens);
            emit Transfer(from, to, tokens);
            return true;


        }
        return false;

    }

    function transfer(address to, uint tokens, bytes data) public returns (bool){
        if(tokens <= balanceOf(msg.sender) && tokens>0 && checkContract(to)){
            balances[msg.sender] = balances[msg.sender].sub(tokens);
            balances[to] = balances[to].add(tokens);
            ERC223ReceivingContract _contract = ERC223ReceivingContract(to);
            _contract.tokenFallback(msg.sender,tokens,data);
            emit Transfer(msg.sender, to, tokens,data);
            return true;

        }

        return false;



    }

    function checkContract(address addr) private view returns(bool){
        uint size;
        assembly {
            size := extcodesize(addr)
        }
        return size > 0;

    }



    function () public payable {
        revert();
    }

}

我试图发送代币的合同:

pragma solidity ^0.4.4;

import "./ERC223_receiving_contract.sol";



contract TradeCenter is ERC223ReceivingContract{


    struct Rec{
        address from;
        uint tokens;
        bytes data;

    }

    mapping(address => uint) private _indexRec;
    mapping(uint => Rec) private _recs;
    uint private _index = 0;

    function tokenFallback(address _from, uint _value, bytes _data) public {

        _recs[_index] = Rec(_from,_value,_data);
        _indexRec[_from] = _index;
        _index++;


    }

    function getAddress() public view returns(address){

        Rec memory _rec = _recs[_indexRec[msg.sender]];

        return _rec.from;



    }




}

以及附加到 html 页面的 JavaScript 代码,用于从合约中调用方法:

 const MetaCoinAddress = "0x64413e3d7775003c801ac50d4becedf038bad5b1";
    const tradecenterAddress = "0x645b70b1f5f1df0e4c0e8efb23025ccace971d3b";





    if(typeof web3 !== 'undefined'){

        web3 = new Web3(web3.currentProvider);

    }else{
        //TODO change Http provider to mainnet

        web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

        //main account[0] only for tests

        web3.eth.defaultAccount = web3.eth.accounts[0];

        var tokenContract = web3.eth.contract(
//abi
).at(MetaCoinAddress);


        var tradeCenter = web3.eth.contract(

//abi

        ).at(tradecenterAddress);



        var account0 = web3.eth.accounts[0];

        var account1 = web3.eth.accounts[1];


        console.log(tokenContract.transfer['address,uint256,bytes'](tradecenterAddress,web3.toWei(20,'ether'),web3.toAscii("te"),{from:account0}));

            //("0xab327cdaf135c3dcacf58a4686f11dcd0ef1d031",web3.toWei(20,'ether'),'tes'));

        console.log(tradeCenter.getAddress());

        console.log(web3.version);




    }

在网页上从 web3 调用传输函数时。

从 Remix Ide 调用传输函数时。

标签: javascripthtmlsolidityweb3remix

解决方案


推荐阅读