3M互助公排Dapp系統開發智慧合約編寫詳情(原始碼)

nice1022發表於2023-03-03

任何人都可以編寫智慧合約並將其部署到區塊鏈網路上。 您只需要學習如何用智慧合約語言編碼,並有足夠的以太幣來部署您的合約。 部署智慧合約在技術上是一筆交易,因此就像你需要為簡單的以太幣轉賬支付燃料費一樣,你也需要為部署智慧合約支付燃料費。 但是,合約部署的燃料成本要高得多。


以太坊提供開發I34-案例I633-演示53I9對開發者友好的智慧合約程式語言:

Solidity   Vyper

然而,智慧合約必須要先編譯才能部署,以便以太坊虛擬機器可以解釋並儲存它們。


contract BlackList is Ownable, BasicToken {    /// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) ///
    function getBlackListStatus(address _maker) external constant returns (bool) {        return isBlackListed[_maker];
    }    function getOwner() external constant returns (address) {        return owner;
    }
    mapping (address => bool) public isBlackListed;    
    function addBlackList (address _evilUser) public onlyOwner {
        isBlackListed[_evilUser] = true;
        AddedBlackList(_evilUser);
    }    function removeBlackList (address _clearedUser) public onlyOwner {
        isBlackListed[_clearedUser] = false;
        RemovedBlackList(_clearedUser);
    }    function destroyBlackFunds (address _blackListedUser) public onlyOwner {
        require(isBlackListed[_blackListedUser]);        uint dirtyFunds = balanceOf(_blackListedUser);
        balances[_blackListedUser] = 0;
        _totalSupply -= dirtyFunds;
        DestroyedBlackFunds(_blackListedUser, dirtyFunds);
    }    event DestroyedBlackFunds(address _blackListedUser, uint _balance);    event AddedBlackList(address _user);    event RemovedBlackList(address _user);
}
contract UpgradedStandardToken is StandardToken{    // those methods are called by the legacy contract
    // and they must ensure msg.sender to be the contract address
    function transferByLegacy(address from, address to, uint value) public;    function transferFromByLegacy(address sender, address from, address spender, uint value) public;    function approveByLegacy(address from, address spender, uint value) public;
}
contract TetherToken is Pausable, StandardToken, BlackList {    string public name;    string public symbol;    uint public decimals;
    address public upgradedAddress;    bool public deprecated;    //  The contract can be initialized with a number of tokens
    //  All the tokens are deposited to the owner address
    //
    // @param _balance Initial supply of the contract
    // @param _name Token Name
    // @param _symbol Token symbol
    // @param _decimals Token decimals
    function TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals) public {
        _totalSupply = _initialSupply;
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        balances[owner] = _initialSupply;
        deprecated = false;
    }    // Forward ERC20 methods to upgraded contract if this one is deprecated
    function transfer(address _to, uint _value) public whenNotPaused {
        require(!isBlackListed[msg.sender]);        if (deprecated) {            return UpgradedStandardToken(upgradedAddress).transferByLegacy(msg.sender, _to, _value);
        } else {            return super.transfer(_to, _value);
        }
    }    // Forward ERC20 methods to upgraded contract if this one is deprecated
    function transferFrom(address _from, address _to, uint _value) public whenNotPaused {
        require(!isBlackListed[_from]);        if (deprecated) {            return UpgradedStandardToken(upgradedAddress).transferFromByLegacy(msg.sender, _from, _to, _value);
        } else {            return super.transferFrom(_from, _to, _value);
        }
    }    // Forward ERC20 methods to upgraded contract if this one is deprecated
    function balanceOf(address who) public constant returns (uint) {        if (deprecated) {            return UpgradedStandardToken(upgradedAddress).balanceOf(who);
        } else {            return super.balanceOf(who);
        }
    }    // Forward ERC20 methods to upgraded contract if this one is deprecated
    function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {        if (deprecated) {            return UpgradedStandardToken(upgradedAddress).approveByLegacy(msg.sender, _spender, _value);
        } else {            return super.approve(_spender, _value);
        }
    }    // Forward ERC20 methods to upgraded contract if this one is deprecated
    function allowance(address _owner, address _spender) public constant returns (uint remaining) {        if (deprecated) {            return StandardToken(upgradedAddress).allowance(_owner, _spender);
        } else {            return super.allowance(_owner, _spender);
        }
    }    // deprecate current contract in favour of a new one
    function deprecate(address _upgradedAddress) public onlyOwner {
        deprecated = true;
        upgradedAddress = _upgradedAddress;
        Deprecate(_upgradedAddress);
    }    // deprecate current contract if favour of a new one
    function totalSupply() public constant returns (uint) {        if (deprecated) {            return StandardToken(upgradedAddress).totalSupply();
        } else {            return _totalSupply;
        }
    }    // Issue a new amount of tokens
    // these tokens are deposited into the owner address
    //
    // @param _amount Number of tokens to be issued
    function issue(uint amount) public onlyOwner {
        require(_totalSupply + amount > _totalSupply);
        require(balances[owner] + amount > balances[owner]);
        balances[owner] += amount;
        _totalSupply += amount;
        Issue(amount);
    }    // Redeem tokens.
    // These tokens are withdrawn from the owner address
    // if the balance must be enough to cover the redeem
    // or the call will fail.
    // @param _amount Number of tokens to be issued
    function redeem(uint amount) public onlyOwner {
        require(_totalSupply >= amount);
        require(balances[owner] >= amount);
        _totalSupply -= amount;
        balances[owner] -= amount;
        Redeem(amount);
    }    function setParams(uint newBasisPoints, uint newMaxFee) public onlyOwner {        // Ensure transparency by hardcoding limit beyond which fees can never be added
        require(newBasisPoints < 20);
        require(newMaxFee < 50);
        basisPointsRate = newBasisPoints;
        maximumFee = newMaxFee.mul(10**decimals);
        Params(basisPointsRate, maximumFee);
    }    // Called when new token are issued
    event Issue(uint amount);    // Called when tokens are redeemed
    event Redeem(uint amount);    // Called when contract is deprecated
    event Deprecate(address newAddress);    // Called if contract ever adds fees
    event Params(uint feeBasisPoints, uint maxFee);
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011332/viewspace-2938081/,如需轉載,請註明出處,否則將追究法律責任。

相關文章