Contract-Development

如何授權多個合約發行同一個 ERC20 代幣?

  • July 29, 2019

我有一個實物產品要賣。我想要一個數字資產來代表我的物理資產的每個單位。我創建了一個 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,也可以創建多個使用相同代幣合約的發行者。

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