javascript - 智能合约在 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);
}
解决方案
推荐阅读
- c# - MenuFlyoutItem 点击事件的问题,但只有“有时”
- javascript - 如何像文本栏动画一样移动画布内的文本?
- python - 如何模拟掷骰子
- javascript - 使用 chokidar 监视文件,参数“忽略”的正则表达式无效
- javascript - 当我来自 2 个不同的函数时,变量未定义
- c# - 将视图模型从剃刀视图传递到控制器操作
- c++ - 我想不出办法让我的代码循环
- laravel - 无法在私有函数中设置 cookie
- java - Java Maven 项目 - Firebase 连接错误:java.lang.NoSuchMethodError
- javascript - WebStorm 禁用特殊文件名的语法高亮显示?