首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ethereum智能契约

Ethereum智能契约
EN

Ethereum用户
提问于 2018-03-20 20:58:39
回答 1查看 109关注 0票数 0

我的dApp智能合同有一些问题。每当有人向智能契约发送以太时,我都想出售这些令牌,并将根据他们的贡献得到一些令牌。

当我部署合同时,我会得到一个错误,它说类似于合同的内容不包含任何数据,但它会立即解除。

一切正常,直到我想把以太送到合同地址。当我试图发送它时,我会得到另一个错误:似乎这个事务将失败。

希望你能尽快帮我!:)

下面我为smart合同提供了代码:

代码语言:javascript
复制
pragma solidity ^0.4.18;

contract SafeMath {
    function safeAdd(uint256 x, uint256 y) internal pure returns(uint256) {
        uint256 z = x + y;
        assert((z >= x) && (z >= y));
        return z;
    }

    function safeSub(uint256 x, uint256 y) internal pure returns(uint256) {
        assert(x >= y);
        uint256 z = x - y;
        return z;
    }

    function safeMult(uint256 x, uint256 y) internal pure returns(uint256) {
        uint256 z = x * y;
        assert((x == 0) || (z / x == y));
        return z;
    }
}

contract Token {
    function balanceOf(address _owner) public constant returns (uint256 balance);
    function transfer(address _to, uint256 _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    function approve(address _spender, uint256 _value) public returns (bool success);
    function allowance(address _owner, address _spender) public constant returns (uint256 remaining);
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

contract StandardToken is Token {
    mapping (address => uint256) balances;
    mapping (address => mapping (address => uint256)) allowed;

    function transfer(address _to, uint256 _value) public returns (bool success) {
        if(balances[msg.sender] >= _value && _value > 0) {
            balances[msg.sender] -= _value;
            balances[_to] += _value;
            Transfer(msg.sender, _to, _value);
            return true;
        } else {
            return false;
        }
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
      if(balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0) {
            balances[_to] += _value;
            balances[_from] -= _value;
            allowed[_from][msg.sender] -= _value;
            Transfer(_from, _to, _value);
            return true;
        } else {
            return false;
        }
    }

    function balanceOf(address _owner) public constant returns (uint256 balance) {
        return balances[_owner];
    }

    function approve(address _spender, uint256 _value) public returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }

    function allowance(address _owner, address _spender) public constant returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }
}

contract VCONAToken is StandardToken, SafeMath {
    string public constant name = 'VCONA Token';
    string public constant symbol = 'VCONA';
    uint256 public constant decimals = 0;

    address public ethFundDeposit;

    bool public isFinalized;
    uint256 public totalSupply;
    uint256 public constant tokenExchangeRate = 100000;
    uint256 public constant tokenCreationCap =  1000000;

    event LogRefund(address indexed _to, uint256 _value);
    event CreateVCONA(address indexed _to, uint256 _value);

    function VCONAToken(address _ethFundDeposit) public {
        isFinalized = false;
        ethFundDeposit = _ethFundDeposit;
        totalSupply = 0;
    }

    function () payable external {
        require(isFinalized != false);
        require(msg.value != 0);

        uint256 tokens = safeMult(msg.value, tokenExchangeRate);
        uint256 checkedSupply = safeAdd(totalSupply, tokens);

        require(tokenCreationCap >= checkedSupply);

        totalSupply = checkedSupply;
        balances[msg.sender] += tokens;
        CreateVCONA(msg.sender, tokens);
    }

    function finalize() external {
        require(isFinalized != false);
        require(msg.sender == ethFundDeposit);
        require(totalSupply == tokenCreationCap);
        isFinalized = true;

        if(!ethFundDeposit.send(this.balance)) revert();
    }

    function refund() external {
        require(isFinalized != false);
        uint256 vconaValue = balances[msg.sender];
        require(vconaValue > 0);
        balances[msg.sender] = 0;
        totalSupply = safeSub(totalSupply, vconaValue);
        uint256 ethValue = vconaValue / tokenExchangeRate;
        LogRefund(msg.sender, ethValue);

        if(!msg.sender.send(ethValue)) revert();
    }
}
EN

回答 1

Ethereum用户

回答已采纳

发布于 2018-03-21 00:28:37

有两件事:

您正在检查的最后确定为真,最后确定必须是假的合同是在“众包”模式。

其次,您没有将msg.value转换为乙醚,所以任何大于10维的值都会使您通过tokenCreationCap

这一退路是可行的:

代码语言:javascript
复制
uint tokenExchangeRate = 0.0001 ether //(10k tokens for 1 ether)


 function () payable external {
        require(!isFinalized);
        require(msg.value != 0 && msg.value >= tokenExchangeRate);

        uint256 tokens = msg.value / tokenExchangeRate 
        uint256 checkedSupply = safeAdd(totalSupply, tokens);

        require(tokenCreationCap >= checkedSupply);

        totalSupply = checkedSupply;
        balances[msg.sender] += tokens;
        CreateVCONA(msg.sender, tokens);
    }
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/43385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档