为啥我基于自己搭建的私链创建代币后,以太坊账户的余额仍然为零?

Posted

技术标签:

【中文标题】为啥我基于自己搭建的私链创建代币后,以太坊账户的余额仍然为零?【英文标题】:Why is the balance of the ethereum account still zero after I create a token based on the private chain I built?为什么我基于自己搭建的私链创建代币后,以太坊账户的余额仍然为零? 【发布时间】:2017-07-28 19:18:04 【问题描述】:

我使用以太坊官网提供的合约代码,[创建你自己的加密货币][1]在geth控制台运行的私有链上创建了一个高级代币。 geth的版本是1.5.5,solc的版本是0.4.8。

我的步骤是:

1.初始化我的geth:geth init genesis.json 然后geth --networkid 42 --nodiscover --maxpeers 0 console em>

2.检查编译器:***eth.getCompilers()***返回:solidity

3.我使用在线编译网站[Remix][2]给了我直接部署我的合约的相关abi和代码。

我输入:

(1)abi=["constant":false,"inputs":["name":"newSellPrice","type":"uint256",…… 太长无法复制结果;

(2)然后创建合约:multiplyContract = web3.eth.contract(abi)

(3)multiply= multiplyContract.new(10000,"AKING",2,"AK",0xf32200730fdaca83f18171015c0be2a6342d46c4,from: primaryAddress, data: 0x+code)强>

第一个参数为初始供应量,第二个参数为代币名称,第三个为十进制单位,第四个为可初始供应代币的地址。

4.检查我的合约是否已经部署:

我输入:txpool.status

然后我得到:pending:1

5.我开始挖掘合约:

输入:miner.start()miner.stop()

然后我输入:eth.getBlock(5319)

我找到了那笔交易。

6.与我的合约交互:

输入:MyContract = eth.contract(abi)

那么:myContract = MyContract.at(multiply.address)

    开始挖矿一段时间。

整个过程很顺利,但是当我输入时

myContract.balanceOf(0xf32200730fdaca83f18171015c0be2a6342d46c4) (地址是eth.account[0]也是我创建的token的地址。我还尝试了其他一些地址,它们都归零。我还尝试了其他一些表达方式,例如 myContract.balanceOf(eth.accounts[0], from: eth.accounts[0])myContract.balanceOf.sendTransaction(eth.accounts[0], from: eth.accounts[0])

如果我使用:eth.getBalance(eth.accounts[0]),它只会返回我帐户中的以太币,这不是我想看到的。

那么,我的流程有什么问题吗?还是遗漏了什么重要的东西?有什么意义?

整个代码如下:

 pragma solidity ^0.4.2;
    contract owned 
    address public owner;

    function owned() 
        owner = msg.sender;
    

    modifier onlyOwner 
        if (msg.sender != owner) throw;
        _;
    

    function transferOwnership(address newOwner) onlyOwner 
        owner = newOwner;
    


contract tokenRecipient  function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData); 

contract token 
    /* Public variables of the token */
    string public standard = 'Token 0.1';
    string public name;
    string public symbol;
    uint8 public decimals;
    uint256 public totalSupply;

    /* This creates an array with all balances */
    mapping (address => uint256) public balanceOf;
    mapping (address => mapping (address => uint256)) public allowance;

    /* This generates a public event on the blockchain that will notify clients */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /* Initializes contract with initial supply tokens to the creator of the contract */
    function token(
        uint256 initialSupply,
        string tokenName,
        uint8 decimalUnits,
        string tokenSymbol
        ) 
        balanceOf[msg.sender] = initialSupply;              // Give the creator all initial tokens
        totalSupply = initialSupply;                        // Update total supply
        name = tokenName;                                   // Set the name for display purposes
        symbol = tokenSymbol;                               // Set the symbol for display purposes
        decimals = decimalUnits;                            // Amount of decimals for display purposes
    

    /* Send coins */
    function transfer(address _to, uint256 _value) 
        if (balanceOf[msg.sender] < _value) throw;           // Check if the sender has enough
        if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows
        balanceOf[msg.sender] -= _value;                     // Subtract from the sender
        balanceOf[_to] += _value;                            // Add the same to the recipient
        Transfer(msg.sender, _to, _value);                   // Notify anyone listening that this transfer took place
    

    /* Allow another contract to spend some tokens in your behalf */
    function approve(address _spender, uint256 _value)
        returns (bool success) 
        allowance[msg.sender][_spender] = _value;
        tokenRecipient spender = tokenRecipient(_spender);
        return true;
    

    /* Approve and then comunicate the approved contract in a single tx */
    function approveAndCall(address _spender, uint256 _value, bytes _extraData)
        returns (bool success)     
        tokenRecipient spender = tokenRecipient(_spender);
        if (approve(_spender, _value)) 
            spender.receiveApproval(msg.sender, _value, this, _extraData);
            return true;
        
    

    /* A contract attempts to get the coins */
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success) 
        if (balanceOf[_from] < _value) throw;                 // Check if the sender has enough
        if (balanceOf[_to] + _value < balanceOf[_to]) throw;  // Check for overflows
        if (_value > allowance[_from][msg.sender]) throw;   // Check allowance
        balanceOf[_from] -= _value;                          // Subtract from the sender
        balanceOf[_to] += _value;                            // Add the same to the recipient
        allowance[_from][msg.sender] -= _value;
        Transfer(_from, _to, _value);
        return true;
    

    /* This unnamed function is called whenever someone tries to send ether to it */
    function () 
        throw;     // Prevents accidental sending of ether
    


contract MyAdvancedToken is owned, token 

    uint256 public sellPrice;
    uint256 public buyPrice;
    uint256 public totalSupply;

    mapping (address => bool) public frozenAccount;

    /* This generates a public event on the blockchain that will notify clients */
    event FrozenFunds(address target, bool frozen);

    /* Initializes contract with initial supply tokens to the creator of the contract */
    function MyAdvancedToken(
        uint256 initialSupply,
        string tokenName,
        uint8 decimalUnits,
        string tokenSymbol,
        address centralMinter
    ) token (initialSupply, tokenName, decimalUnits, tokenSymbol) 
        if(centralMinter != 0 ) owner = centralMinter;      // Sets the owner as specified (if centralMinter is not specified the owner is msg.sender)
        balanceOf[owner] = initialSupply;                   // Give the owner all initial tokens
    

    /* Send coins */
    function transfer(address _to, uint256 _value) 
        if (balanceOf[msg.sender] < _value) throw;           // Check if the sender has enough
        if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows
        if (frozenAccount[msg.sender]) throw;                // Check if frozen
        balanceOf[msg.sender] -= _value;                     // Subtract from the sender
        balanceOf[_to] += _value;                            // Add the same to the recipient
        Transfer(msg.sender, _to, _value);                   // Notify anyone listening that this transfer took place
    


    /* A contract attempts to get the coins */
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success) 
        if (frozenAccount[_from]) throw;                        // Check if frozen            
        if (balanceOf[_from] < _value) throw;                 // Check if the sender has enough
        if (balanceOf[_to] + _value < balanceOf[_to]) throw;  // Check for overflows
        if (_value > allowance[_from][msg.sender]) throw;   // Check allowance
        balanceOf[_from] -= _value;                          // Subtract from the sender
        balanceOf[_to] += _value;                            // Add the same to the recipient
        allowance[_from][msg.sender] -= _value;
        Transfer(_from, _to, _value);
        return true;
    

    function mintToken(address target, uint256 mintedAmount) onlyOwner 
        balanceOf[target] += mintedAmount;
        totalSupply += mintedAmount;
        Transfer(0, this, mintedAmount);
        Transfer(this, target, mintedAmount);
    

    function freezeAccount(address target, bool freeze) onlyOwner 
        frozenAccount[target] = freeze;
        FrozenFunds(target, freeze);
    

    function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner 
        sellPrice = newSellPrice;
        buyPrice = newBuyPrice;
    

    function buy() payable 
        uint amount = msg.value / buyPrice;                // calculates the amount
        if (balanceOf[this] < amount) throw;               // checks if it has enough to sell
        balanceOf[msg.sender] += amount;                   // adds the amount to buyer's balance
        balanceOf[this] -= amount;                         // subtracts amount from seller's balance
        Transfer(this, msg.sender, amount);                // execute an event reflecting the change
    

    function sell(uint256 amount) 
        if (balanceOf[msg.sender] < amount ) throw;        // checks if the sender has enough to sell
        balanceOf[this] += amount;                         // adds the amount to owner's balance
        balanceOf[msg.sender] -= amount;                   // subtracts the amount from seller's balance
        if (!msg.sender.send(amount * sellPrice))         // sends ether to the seller. It's important
            throw;                                         // to do this last to avoid recursion attacks
         else 
            Transfer(msg.sender, this, amount);            // executes an event reflecting on the change
                       
    

【问题讨论】:

属于 ethereum.stackexchange.com。 OTOH,您需要在 web3 中的地址周围加上引号。 哇,非常感谢您的好意建议! 我已经在那里提交了我的问题,但是我对你评论的后面部分有点困惑? 我认为将地址输入为数字会遇到 javascript 的限制(64 位?),因此您可以尝试在 web3/控制台中的任何位置用引号将地址括起来(“0xf322....”) 【参考方案1】:

用引号将地址括起来。

把这个myContract.balanceOf(0xf32200730fdaca83f18171015c0be2a6342d46c4)改成这个myContract.balanceOf("0xf32200730fdaca83f18171015c0be2a6342d46c4")

【讨论】:

以上是关于为啥我基于自己搭建的私链创建代币后,以太坊账户的余额仍然为零?的主要内容,如果未能解决你的问题,请参考以下文章

以太坊私链部署erc20_usdt代币

在CentOS7.9上搭建以太坊私链

以太坊交易:为啥交易后余额没有变化?

搭建区块链私链

以太坊搭建私链

如何使 uniswap v2 去中心化交易所支持以太坊私链