deleteFile: ACL付きのファイルを削除

ACL(アクセスコントロール)付きのファイル削除方法について説明します。

API

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

処理シーケンス

sendData SomeContract

  • 1 AltExecCnsContract#deleteFile

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

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

  • 1.1 API DELETE file

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

  • 1.1.1 ContractNameService#getLatestcontract

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

  • 1.1.2 checkExistance

    APIサーバが指定されたオブジェクトIDの存在チェックを行います。

    (オブジェクトIDのデータが存在『しない』場合にエラー(400 BadRequest))

  • 1.1.3 SomeContract#someMethod

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

    呼び出しの際に、第2引数が bytes32 : objectId となります。

    コントラクトのメソッド内で、指定されたオブジェクトIDを元にFileObjectの削除処理を行います。

    サービスプロバイダのコントラクトだけでは、データの削除は完了せず、この後APIサーバ側のデータ検証完了後のトランザクションによって、削除処理が完了します。

    詳細は、FileObjectLogic をご参照ください。

  • 1.1.4 deleteFile

    APIサーバが、本サービスのキーを用いてデータの削除を行います

    FileObjectに削除権限のあるコントラクトのみが削除処理(1.1.3)をすることができます。

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

フローは多少複雑ですが、サービスプロバイダの実装は非常にシンプルなものになっています。

  • ClientSide

    • AltExecCnsContract#deleteFile

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

    • SomeContract

      実装するコントラクトは、エンドユーザが指定した通りのパラメータで呼び出しが行われますが、第2引数が bytes32 : objectId、として渡されます。

      contract SomeContract is VersionContract {
      
          mapping(address => bool) allowUsers;
          ContractNameService constant GMO_CNS = ContractNameService (0x9148550103573a730535f95a01323a9fc3dc6aa0);
      
          function SomeContract(ContractNameService _cns) VersionContract(_cns, "SomeContract") {}
      
          function someMethod(
                  bytes _sign, 
                  bytes32 _objectId, 
                  bytes32 _p0, 
                  uint _p1, 
                  bytes32 _p2) {
      
              // create all parameters hash
              bytes32 hash = calcEnvHash('someMethod');
              hash = sha3(hash, _objectId);
              hash = sha3(hash, _p0);
              hash = sha3(hash, _p1);
              hash = sha3(hash, _p2);
              // get end user's addresss
              address endUserAddr = Utils.recoverAddress(hash, _sign);
              if (!allowUsers[endUserAddr]) throw;
      
              // remove fileObject
              FileObject object = FileObject(GMO_CNS.getLatestContract("FileObject"));
              object.remove(_objectId);
          }
      }
      

注意点

  • msg.sender

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

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

    エンドユーザのサインは、第一引数の、bytes _sign として渡されていて、ここからサインの検証と、エンドユーザのアドレス取得を行います。

  • 実装の簡略化

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

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

results matching ""

    No results matching ""