getData : ACL付きのデータを取得

ACL(アクセスコントロール)付きのデータ取得方法について説明します。

API

Z.com Cloud ブロックチェーン / ConoHa ブロックチェーン

処理シーケンス

getData SomeContract

  • 1 AltExecCnsContract#getData

    クライアントのロジックから、AltExecCnsContractを呼出を行います。

    呼出の際に、最終的に呼び出すコントラクトの「名称」「関数名」「パラメータ」なども含めて呼出を行います。

  • 1.1 API GET data

    本サービスが提供するクライアントのモジュールが、すべての引数から導出したハッシュ値に対してサインをした上でAPIの呼出を行います。

  • 1.1.1 ContractNameService#getLatestcontract

    APIサーバが、CNSに最新のバージョンのContractのアドレスを問い合わせます。

  • 1.1.2 SomeContract#someMethod

    APIサーバが、エンドユーザの命令通りにコントラクトを呼び出します。

    その際に、対象の Contract がダウンロード対象の オブジェクトID リストを返却するように、サービスプロバイダ側での実装が必要です。

  • 1.1.3 isReader

    APIサーバ内で、エンドユーザ(のアドレス)が対象のデータに対する読込み権限があるかEthereum上のデータを確認します。

  • 1.1.4 getData

    Ethereum上のデータからデータのHash値を取得し、該当するデータをデータストアから取得してエンドユーザに返却します。

サービスプロバイダ側の実装内容

  • ClientSide

    • AltExecCnsContract#getData

      var contract = new AltExecCnsContract(account, '__CNS_ADDRESS__');
      contract.getData('__PASSWORD__', 'SomeContract', 'someMethod', ['p0', 1, 'p2'], abi, function(err, res) {
          if (err) console.error(err);
          else {
              res.map(function(d) {
                  console.log(d.data);
              });
          }
      }
      
  • Contract

    • SomeContract

      実装するコントラクトは、エンドユーザが指定した通りのパラメータで呼び出しが行われますが、戻り値として取得対象となるオブジェクトID群を返却するように実装します。

      contract SomeContract is VersionContract {
      
          function SomeContract(ContractNameService _cns) VersionContract(_cns, "SomeContract") {}
      
          function someMethod(
                  bytes32 _p0, 
                  uint _p1, 
                  bytes32 _p2) constant returns (bytes32[3]) {
      
              var memory objIds = bytes32[3];
              objIds[0] = "objectId0";
              objIds[1] = "objectId1";
              objIds[2] = "objectId2";
              return objIds;
          }
      }
      

注意点

  • msg.sender

    constant関数の呼出は、代払い用のアカウントのサインで行われます。

    msg.senderは、各サービスプロバイダの代払い用のアカウントとなり、本来の呼出元のエンドユーザではありません。

    Ethereumではデータは基本的にオープンであり、読込み処理に関して、ユーザの権限管理は不要と本サービス(β版)では考えており、エンドユーザのサインチェックはAPIサーバ内で留めています。

    ( ただ、この点についてはβ版終了時のプロダクション化した際に変更される可能性がありますので、ご了承ください。)

  • 実装の簡略化

    上記の例は、要点を説明するため、SomeContractに直接ロジックを実装していますが、実際には 基本コントラクト構成 の形式での実装が必要です。

    本来のContractの実装方法については、下記ソースを参考にしてください。

results matching ""

    No results matching ""