Contract-Development
如何授權多個合約發行同一個 ERC20 代幣?
我有一個實物產品要賣。我想要一個數字資產來代表我的物理資產的每個單位。我創建了一個 ERC20 代幣合約,每個代幣代表我製造和想要銷售的產品的一個獨特實例。當新產品下線時,就會產生新的代幣。
注意:我選擇了一個可替代的代幣,因為每個產品單位的生命週期價值保持不變。這也使我的 ERC20 代幣以及我的產品在公開市場上的交易成為可能,因為每個代幣的價值將永遠相同。
問題是我的大部分業務邏輯都出現在主 ERC20 合約中。我想讓 ERC20 代幣合約盡可能精簡。如果我的業務邏輯發生變化,我不想暫停代幣並創建新合約。令牌應保持不變。為了實現這一點,我想要一種授權契約或我作為所有者應該能夠呼叫的方式,例如來自我的主 ERC20的**issueToken函式。**考慮讓多個店面和銷售渠道接受訂單,並在確定有效訂單後履行訂單並向買家發放代幣。這也將幫助我將訂單、物理產品數據和相關元數據與我的主要 ERC20 分開。但是,我確實想要一個獨特的產品與一個獨特的 ERC20 代幣的一對一映射。
我怎樣才能最好地建構這種行為?
首先,由於 ERC20 是非唯一代幣的標準,因此很難實現一對一的產品代幣映射。您是否嘗試過 ERC-721 標準?http://erc721.org/
但是如果你想堅持 ERC20,我猜你想要這樣的東西(對不起,如果有一些小錯別字,我在網站的文本框中輸入了它)
令牌.sol
... //place to store privileged users and contracts, simple manager pattern mapping(address=>bool) public managers; //user that deployed contract, simple owner pattern address public owner; constructor() public { owner = msg.sender; managers[owner] = true; //the rest of your constructor goes here } function issueToken(uint256 number) public { //only privileged user/contract can call it require(managers[msg.sender]); totalTokens += number; //increasing token suppply balances[msg.sender] += number; //balances is mapping where you store balances of each holder } //simple function to toggle managers on/off function setManager(address manager, bool state) { require(owner == msg.sender); managers[manager] = state; } ...
發行人.sol
... Token public token; //of course better to use interface here, like IToken.sol constructor(Token _token) public { token = _token; } function issueTo(uint256 number, address destination) { token.issueToken(number); //now balance of contract has +number tokens, transfer it to destination token.transfer(destination, number); } ...
部署 Token 和 Issuer 合約後,您必須“連接”它們,呼叫
token.setManager(issuer, true)
之後,您可以呼叫 issuer.issueTo,也可以創建多個使用相同代幣合約的發行者。