学习
实践
活动
工具
TVP
写文章

使用以太坊创建你自己的加密货币-代币(六)

自动销售和购买

到目前为止,您依靠实用程序和信任来评估您的代币。但是如果您需要的话,您可以通过创建一个能够以市场价值自动销售和购买的基金来让代币的价值得到以太币(或其他代币)的支持。

首先,我们来设置买入和卖出的价格:

uint256public sellPrice;

uint256public buyPrice;

functionsetPrices(uint256 newSellPrice, uint256 newBuyPrice)

onlyOwner {

sellPrice= newSellPrice;

buyPrice= newBuyPrice;

}

对于不经常更改的价格,这是可以接受的,因为每次新的价格变化都需要您执行交易并花费一点以太币。如果您希望持续浮动价格,我们建议您调查标准输入数据。

下一步是制定买入和卖出功能:

functionbuy()payablereturns(uint amount){

amount = msg.value / buyPrice;// calculates the amountrequire(balanceOf[this] >= amount);// checks if it has enough to sellbalanceOf[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

returnamount;// ends function and returns

}

functionsell(uint amount)returns(uint revenue){

require(balanceOf[msg.sender] >= amount);

// checks if the sender has enough to sell

balanceOf[this] += amount;// adds the amount to owner's balancebalanceOf[msg.sender] -= amount;

// subtracts the amount from seller's balance

revenue = amount * sellPrice;

// sends ether to the seller: it's important to do this last to prevent recursion attacks

Transfer(msg.sender,this, amount);

// executes an event reflecting on the change

returnrevenue;// ends function and returns

}

请注意,这不会创建新的代币,但会更改合同所拥有的余额。合同既可以拥有自己的代币,也可以拥有合约的所有者,同时它可以设定价格,或者在某些情况下创建新的代币(如果适用),它不会触及银行的代币或以太坊。这个合约可以调动资金的唯一方式是通过出售和购买它们。

注意:购买和销售“价格”不是用以太币设置,而采用称作"wei"的最小货币系统(等同于欧元和美元,或比特币中的‘’Satosh”。一个以太相当于1000000000000000000 wei。因此,当采用以太币设置代币价格时,后面需要添加18个零。

在创建合约时,向其发送足够的以太币,以便它可以回购市场上的所有代币,否则您的合约将破产,您的用户将无法出售其代币。

前面的例子里所当然地描述了与单个中央买方和卖方签订的合约,更有趣的合约将允许任何人在交易市场可以提供不同的价格,或者允许直接从外部资源导入价格。

自动反馈

每次,您在以太坊上进行交易,您需要向生成区块的矿工支付费用,以计算您的智能合约的结果。虽然这可能会在未来发生变化,但目前费用只能在以太网中支付,因此您的代币的所有用户都需要以太币。账户余额小于费用的账户将被卡住而不能交易,直到用户可以支付必要的费用。但在某些使用案例中,您可能不希望用户考虑以太坊,区块链或如何获得以太币,因此只要检测到账户余额过低而会导致不能发生交易的危险情况,您的账户就会自动获得补充。

为了做到这一点,首先您需要创建一个变量来保存门槛值和一个函数来能够改变它。如果您不知道给变量设置多少,那就将它定为5芬尼(0.005以太币)。

uintpublicminBalanceForAccounts;

functionsetMinBalance(uintminimumBalanceInFinney) onlyOwner{ minBalanceForAccounts = minimumBalanceInFinney *1finney;

}

然后,将此行添加到传递函数中,以便退还发送者:

/* Send coins */

functiontransfer(address _to, uint256 _value){ ...

}

您也可以改变它,以便发送者向接收者支付费用:

/* Send coins */

functiontransfer(address _to, uint256 _value){ ...

if(_to.balance

_to.send(sell((minBalanceForAccounts -_to.balance) / sellPrice));

}

这将确保接收该代币的账户余额不会少于必要的以太币来支付费用。

工作量证明

有一些方法可以将您的代币供应与数学公式相结合。最简单的方法之一是将它与以太坊“合并采矿”,这意味着任何在以太坊上发现区块的人都会从你的代币中获得奖励,奖励那些在区块调用奖励函数的矿工。您可以使用special keyword coinbase来指定找到该区块的矿工。

-待续-

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180607G1ZA1T00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券