Nebulas基礎技術の知能契約

4487 ワード

Nebulas基礎技術の知能契約
インテリジェント契約
使う言語はJavaScriptとType Scriptです.基本的にJavaScriptを選択すればいいです.
どちらの言語もgoogleのChrome V 8エンジンによってサポートされます.
契約はNebulasの中で、相手の言語で作成されたクラスと似ています.これらのクラスには変数と方法があります.方法はこれらの変数を変更できます.変数に代表されるデータは恒久的に保存されます.
知能契約書を作成する
一つの知能契約にはinit方法が含まれていなければなりません.この方法は契約配置時のみ実行されます.ひをもって最初の方法はprvateで、事務処理中に実行されません.他の方法はpublicで、事務処理中に実行可能です.
スマート契約はChrome V 8で実行されるので、すべてのインスタンス変数がメモリにあるので、すべてのインスタンスをNebulasのstate trieに保存するのは賢明ではない.Nebulasでは、Local ContractStrageとGlobal ContractStrageオブジェクトを提供して、開発者の定義を支援して、state trieに保存するフィールドを提供します.これらのフィールドは契約の構造関数で定義されるべきで、他の関数の前に.
例えば以下は簡単な知能契約の例です.
class Rectangle {
    constructor(){
        // define fields stored to state trie
        LocalContractStorage.defineProperties(this,{
            height:null,
            width:null,
        });
    }
    
    //init function
    init(height,width) {
        this.height = height;
        this.width = width;
    }

    // calculate area function
    calculateArea(){
        return this.height*this.width;
    }
    
    // verify function
    verify(expected){
        let area = this.calculateArea();
        if(expected != area){
            throw new Error("Error:expected "+ expected + " ,actual is "+ area + ".");
        }
    }
}
可視性
Nebulasでは、2つの視認性、public、prvateを定義します.JavaScriptでは、関数の視認性の問題を議論する必要はなく、すべての方法はプロトタイプオブジェクトの中でpublicと定義されています.
  • public public方法は、事務処理において呼び出されることができる
  • .
  • prvate以_最初は、publicメソッドによってのみ呼び出されます.
  • Local ContractStrorage
    Local ContractStrorageモジュールは、記憶容量に基づくstate trieを提供する.文字列のkey valueペアしか受け付けられません.すべてのデータは現在のスマート契約アドレスに関するプライベートstate trieに格納されています.現在のスマート契約だけがそれらにアクセスできます.
    BigNumber
    BigNumberモジュールはbignumber.jsスクリプトを利用しています.任意の精度の10進数と10進数以外のアルゴリズムのためのJavaScriptライブラリです.知能契約はBigNumberを直接使用して取引の値と他の値の移動を処理することができます.
    var value = new BigNumber(0);
    value.plus(1)
    ...
    
    Blockchain
    Blockchainモジュールは、現在の契約で実行されている取引およびブロックを取得するためのスマート契約の対象を提供する.また、NASは契約から移転し、アドレスチェックを提供することができる.
    //current block
    Blockchain.block;
    
    //current transaction,transaction's value/gasPrice/gasLimit auto change to BigNumber object
    Blockchain.transaction;
    
    // transfer NAS from contract to address
    Blockchain.transfer(address,value);
    
    // verify address
    Blockchain.verifyAddress(address);
    
    以下は上のモジュールを使用した例です.
    'use strict';
    var SampleContract = function(){
        LocalContractStorage.defineProperties(this,{
            name:null,
            count:null
        });
        LocalContractStorage.defineMapProperty(this,"allocation");
    };
    
    SampleContract.prototype = {
        init:function(name,count,allocation){
            this.name = name;
            this.count = count;
            allocation.forEach(function(item){
                this.allocation.put(item.name,item.count);
            },this);
            console.log('init: Blockchain.block.coinbase = ' + Blockchain.block.coinbase);
            console.log('init: Blockchain.block.hash = ' + Blockchain.block.hash);
            console.log('init: Blockchain.block.height = ' + Blockchain.block.height);
            console.log('init: Blockchain.transaction.from = ' + Blockchain.transaction.from);
            console.log('init: Blockchain.transaction.to = ' + Blockchain.transaction.to);
            console.log('init: Blockchain.transaction.value = ' + Blockchain.transaction.value);
            console.log('init: Blockchain.transaction.nonce = ' + Blockchain.transaction.nonce);
            console.log('init: Blockchain.transaction.hash = ' + Blockchain.transaction.hash);
        },
    
        transfer:function(address,value){
            var result = Blockchain.transfer(address,value);
            console.log("transfer result:",result);
            Event.Trigger("transfer",{
                Transfer:{
                    from:Blockchain.transaction.to,
                    to:address,
                    value:value
                }
            });
        },
    
        verifyAddress: function (address) {
            var result = Blockchain.verifyAddress(address);
            console.log("verifyAddress result:", result);
        }
    };
    module.exports = SampleContract;
    
    イベント
    Eventモジュールは、スマート契約における実行イベントを記録します.記録されたイベントはチェーン上のevent trieに格納されており、これはパラメータとしてFetEvents方式でブロックから取得することができる.すべてのスマート契約イベントのテーマはchain.co ntract.プレフィックスであり、彼らがスマート契約のテーマを締結する前に.
    Event.Trigger(topic,obj);
    
  • topic:user-defined topic
  • obj:JSON object