如何轉移乙太坊代幣
我製作了自己的乙太坊代幣進行測試,並嘗試購買一些代幣。但是有一些問題。當我發送 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(); }
你誤解了代幣和智能合約的工作原理。
您的智能合約中沒有任何功能可以向您發送代幣以換取乙太幣。契約不會做任何未編碼的事情。
代幣合約通常只是代幣的儲存場所——合約憑空創建代幣並儲存它們,直到有人(被允許)向它發出轉移命令。
代幣合約通常不用作交易所。您可以對其進行編碼以獲取乙太幣並返回代幣,但匯率會是多少?它會是恆定的嗎?
如果將代幣兌換成乙太幣,通常是通過交易所進行的。交易所接收您的乙太幣並向代幣合約發出轉賬命令,以向您發送一定數量的代幣(或批准您的提款以從合約中提取代幣)。當然,要讓一個代幣在交易所上市並不容易。