为啥我基于自己搭建的私链创建代币后,以太坊账户的余额仍然为零?
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")
【讨论】:
以上是关于为啥我基于自己搭建的私链创建代币后,以太坊账户的余额仍然为零?的主要内容,如果未能解决你的问题,请参考以下文章