sendTransaction : トランザクションの発行

トランザクションを発行するメソッドを呼び出す方法を説明します。

API

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

処理シーケンス

トランザクション発行フローは下記になります。

constantメソッド呼出時との違いは、最終的なSomeContractの呼び出し時に、パラメータの先頭にエンドユーザのsignが含まれていることです。

このサインを用いて、エンドユーザの入力値の検証と、アドレス取得を行います。

Send Transaction

  • 1 AltExecCnsContract#sendTransaaction

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

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

  • 1.1 API POST transaction

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

  • 1.1.1 ContractNameService#getLatestcontract

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

  • 1.1.2 SomeContract#someMethod

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

    呼出の際に、エンドユーザのサインを第一引数に付与します。

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

  • ClientSide

    • AltExecCnsContract#sendTransaction

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

    • SomeContract

      contract SomeContract is VersionContract  {
      
          mapping(address => bool) allowUsers;
      
          function SomeContract(ContractNameService _cns) VersionContract(_cns, "SomeContract") {}
      
          function someMethod(
                  bytes _sign, 
                  bytes32 _p0, 
                  uint _p1, 
                  bytes32 _p2) {
      
              // create all parameters hash
              bytes32 hash = calcEnvHash('someMethod');
              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;
      
              // do something
          }
      }
      

      Contract内でのサイン確認の詳細については、こちらをご確認ください。

注意点

  • msg.sender

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

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

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

  • 実装の簡略化

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

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

results matching ""

    No results matching ""