Contract-Development

如何轉移乙太坊代幣

  • March 18, 2018

我製作了自己的乙太坊代幣進行測試,並嘗試購買一些代幣。但是有一些問題。當我發送 0.2 個乙太坊時,我沒有得到任何代幣,代幣仍然只有所有者。我的契約程式碼有什麼問題嗎?

有我的原始碼:https ://ropsten.etherscan.io/address/0x2e52b4d709196011bfcbe9f34838d01cd92ee2ff#code

有測試交易

https://ropsten.etherscan.io/tx/0xd5774eba8f46cec3fd85ab4a086d59fef46de8f2e8800fbad1d15520ed82b19a

乙太幣代幣購買

通常,乙太幣的代幣購買由主記憶體儲代幣外部的合約提供,即所謂的“眾籌”合約。

該銷售契約將從主要 ECR20 代幣的契約中轉移代幣,並將具有支付功能,接受以乙太幣支付以換取代幣。

在乙太坊主文件https://www.ethereum.org/crowdsale中有更多詳細資訊。

一個簡單的例子:

那裡有許多功能齊全的眾籌合約,但這個例子巧妙地展示了基礎知識:

pragma solidity ^0.4.19;

interface iERC20 {
   function totalSupply() public constant returns (uint256 supply);
   function balanceOf(address owner) public constant returns (uint256 balance);
   function allowance(address owner, address spender) public  view returns (uint remaining);
   function transfer(address to, uint tokens) public returns (bool success);
   function approve(address spender, uint tokens) public returns (bool success);
   function transferFrom(address from, address to, uint tokens) public returns (bool success);
}

/// @title An example contract that demonstrates buying tokens with eth.
/// @dev This contract must be created with the address of the token to sell.
/// This contract must also own some quantity of the token it's selling.
/// Note: This is an example only and is not meant to be feature complete.
contract Crowdsale {
   iERC20 token;
   address owner;
   uint rateMillionths;

   modifier ownerOnly() {
       require(msg.sender == owner);
       _;
   }

   // @notice Initialises the contract.
   // @param _main The address of an ERC20 compatible token to sell.
   function Crowdsale(address _main) public {
       token = iERC20(_main);
       owner = msg.sender;
       rateMillionths = 1000000;
   }

   /// @notice Will transfer all ether in this account to the contract owner.
   function withdraw() public ownerOnly {
       owner.transfer(this.balance);
   }

   /// @notice This function will set the conversion rate (in millionths).
   /// @dev To set a rate of 1.5token / eth, you would make the rate 1,500,000 and so forth.
   /// @param _rateMillionths The conversion rate in millionths.
   function setRate(uint _rateMillionths) public ownerOnly {
       rateMillionths = _rateMillionths;
   }

   /// @notice Any funds sent to this contract will be converted to the linked contract's tokens
   /// @dev This function receives funds, and transfers tokens based on the current conversion rate
   function () public payable {
       uint value = msg.value * rateMillionths;
       // Overflow detection/protection:
       require(value/msg.value == rateMillionths);
       value = value / 1000000;
       token.transfer(msg.sender, value);
   }
}

每當有人將乙太幣轉移到該合約時,它將把發送的 wei 的數量乘以rateMillionths並除以一百萬,以計算要發行給發送者的代幣合約的十分之一(小數點後 18 位的最小單位)的數量。

然後它將該數量的令牌從其餘額轉移給發送者。

因此,該合約以乙太幣和較小的代幣餘額結束,而發送者以較小的乙太幣餘額和適當數量的代幣結束。

眾籌的所有者(創建者)隨後可以呼叫withdraw()以將目前的乙太幣餘額轉移給他們。

由於這是一個簡單的範例,因此您通常希望在眾籌中具有其他功能,例如:

  • 所有者收回未售出代幣的能力
  • 恢復任何意外發送的其他類型的 ERC20 代幣
  • 將所有權轉讓給新所有者
  • 暫停和恢復銷售等。

所有這些功能都可以在更全面的契約範例中找到。

停止意外的乙太幣轉移

為了阻止人們不小心將乙太幣發送到主合約並期望自己獲得代幣,您需要為其添加一個拒絕回退函式:

/// @notice Payments to this contract will not get tokens.
/// @dev Please send payments to the crowdsale contract instead.
function () public payable {
   revert();
}

你誤解了代幣和智能合約的工作原理。

您的智能合約中沒有任何功能可以向您發送代幣以換取乙太幣。契約不會做任何未編碼的事情。

代幣合約通常只是代幣的儲存場所——合約憑空創建代幣並儲存它們,直到有人(被允許)向它發出轉移命令。

代幣合約通常不用作交易所。您可以對其進行編碼以獲取乙太幣並返回代幣,但匯率會是多少?它會是恆定的嗎?

如果將代幣兌換成乙太幣,通常是通過交易所進行的。交易所接收您的乙太幣並向代幣合約發出轉賬命令,以向您發送一定數量的代幣(或批准您的提款以從合約中提取代幣)。當然,要讓一個代幣在交易所上市並不容易。

引用自:https://ethereum.stackexchange.com/questions/43056