分投趣Fintoch借貸質押模式系統開發部署技術介紹

Lyr96246466發表於2023-04-15

智慧合約是一種計算機程式碼,開發+18I鏈上合約-259l開發系統3365-+可簡化某些協議的執行並消除中間商的需求。智慧合約和區塊鏈是相關技術,因為後者是一個智慧合約平臺。換句話說,智慧合約建立在區塊鏈上。


有大量智慧合約應用程式和智慧合約用例。


交付服務是智慧合約的例子之一:智慧合約可以在包裹交付後自動將錢轉賬給快遞員。無需簽署任何傳統合同,傳送方只需用加密貨幣填充智慧合約,然後智慧合約透過硬幣(例如比特幣和智慧合約)來處理所有事務。


換言之智慧合約會在滿足某些條件時執行寫入其程式碼中的內容,使交易透明,防欺詐,更快且不可逆,不需中央授權,程式碼可以幫助交易雙方在沒有中間人的情況下進行協作。


智慧合約的概念已經探討了20多年,隨著區塊鏈技術的到來,才有機會獲得更廣泛的利用。


pragma solidity >=0.7.0 <0.9.0;

 

//用Remix編寫,需手動呼叫function以實現相關功能

contract SimplePaymentChannel{

    address payable public sender;//發件人地址

    address payable public recipient;//收件人地址

    uint public expiration;//儲存合約到期時間,防止收件人一直不關閉合約,佔用發件人以太幣資源

 

    //建構函式,部署合約時呼叫,僅呼叫一次

    //初始化發件人地址,收件人地址,合約有效時間

    constructor(address payable recipientAddress, uint256 duration) payable{

        sender = payable(msg.sender);//msg.sender是address型別,需強制型別轉換為payable address型別

        recipient = recipientAddress;

        expiration = block.timestamp + duration;

    }

 

    //銷燬合約,只有收件人能銷燬合約

    function close(uint256 amount, bytes memory signature) external{

        //require()中判斷條件為true則繼續,為false則退出該function,回退該function內所有更改

        require(msg.sender == recipient);//判斷呼叫該function地址是否為收件人

        require(isValidSignature(amount, signature));//判斷收件人是否掌握有正確的的發件人訊息簽名

 

        recipient.transfer(amount);//把應得的以太幣傳送給收件人,誰呼叫transfer(),就給誰轉賬

        selfdestruct(sender);//銷燬當前合約,將合約剩餘資金髮送到給定地址sender

        //由於合約內容已被記錄在舊的區塊上,仍可以被查詢,但不能被再次呼叫,除非重新部署該合約

    }

 

    //合約有效期續期,僅有發件人可以呼叫

    function extend(uint256 newExpiration) external{

        require(msg.sender == sender);//判斷呼叫者是否為發件人

        require(newExpiration > expiration);//判斷新的有效期是否大於當前有效期

 

        expiration = newExpiration;//重置合約有效期

    }

 

    //判斷當前合約是否在有效期內

    function claimTimeout() external{

        require(block.timestamp >= expiration);//判斷當前合約是否過期,若過期,則銷燬合約

        selfdestruct(sender);//銷燬合約

    }

 

    //函式isValidSignature(),splitSignature(),recoverSigner(),prefixed()涉及到 橢圓曲線加密 訊息的驗證過程,

    //詳見我的另一篇部落格https://www.cnblogs.com/forkroad/p/16121333.html,有詳細介紹

    function isValidSignature(uint256 amount, bytes memory signature) internal view returns(bool){

        bytes32 message = prefixed(keccak256(abi.encodePacked(this, amount)));//根據當前地址this和轉賬金額amount雙重加密為訊息message

        return recoverSigner(message, signature) == sender;//

    }


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

相關文章