見出し画像

[Lisk SDK - PoC]Password Lock Transaction

お久しぶりです

はい。久しぶりの投稿です。
Lisk SDK を使って何かできないかなー。など考えていたらエライ時間が過ぎてましたね。。
ということで、作りましたのでその説明をダラダラと書きますよ。

概要

Password Lock TransactionはLisk SDKで作成されたカスタムトランザクションです。
そして、以下の3つのトランザクションで成り立っています。

・送信トランザクション(password lock send transaction)

LSK(Lisk上のアプリケーションを実行する際に使用されるユーティリティトークン)を送信するトランザクションです。
インスタンス生成時にasset.dataを暗号化します。
暗号化に使用したパスワードを取得することが出来ます。
※asset.dataの暗号化はプライバシー保護を目的としたものではありません。

・受信トランザクション(password lock receive transaction)

送信トランザクションで設定されたLSKを受取る為のトランザクションです。
パスワードで送信トランザクションに設定されている暗号化されたasset.dataを復元します。
パスワードが一致しない場合はLSKは受け取れません。
※パスワードはこのトランザクションに載ります。

・キャンセルトランザクション(password lock cancel transaction)

送信トランザクションをキャンセルするトランザクションです。
送信トランザクションの作成者のみ実施可能です。
既に受け取られている場合(受信トランザクションが存在する場合)はキャンセルできません。

目的

Password Lock TransactionはLiskアドレスが分からない相手にもLSKを送ることを目的としています。

ユースケース

例1:SNS内でのLSKの送信

SNSのAPIを使用して特定のルールに従った投稿内容から送信トランザクションを生成することが出来れば、SNS内でLSKのやり取りを行うサービスを作成することが出来るかもしれません。

例2:メールでのLSKの送信

パスワードとトランザクションIDをメールで送ることでLSKを送信することが出来るかもしれません。
※この場合は、送信と受信を行う簡易的なWEBサイトが必要になるでしょう。

各種トランザクションについて

・送信トランザクション(password lock send transaction)

概要に記載している通り、トランザクション生成時にasset.dataを暗号化します。以下例

const param = {
  asset: {
    data: {
      senderId: '8273455169423958419L',
      amount: 0.5
    }
  },
  ...
}

const tx = new PasswordLockSendTransaction(param);
上記の new PasswordLockSendTransaction(param) でインスタンスを生成すると、param内の asset.data がAES-256-CBCで暗号化されます。
暗号化に使用したパスワードは tx.password で取得できます。 

インスタンス生成後は asset に cipherText プロパティが追加され、asset.dataを暗号化した文字列が設定されます。

asset: {
  data: {
    senderId: '8273455169423958419L',
    amount: 0.5
  },
  cipherText: 'fa3fd169c492576177...5e8c7e46a484d00d8414'
}

・受信トランザクション(password lock receive transaction)

以下のパラメータを送信することで送信トランザクションに対する受信処理を行います。

const param = {
  data: {
    asset: {
      data: {
        targetTransactionId: "6257980881051108330",
        password: "P7F3NKjct=3wEyT*QU",
      }
    },
    ...
  }
}

const tx = new PasswordLockReceiveTransaction(param);
asset.data内に送信トランザクションのトランザクションID(targetTransactionId)とLSKを受け取るためのパスワード(password)を設定します。
パスワードで対象となる送信トランザクションに設定されているcipherTextが複合できるかのチェックを行い、複合出来ればLSKを受け取ることができます。
Liskアドレスを保有していない場合もLSKを受け取ることができるように、カスタムトランザクションの設定上のトランザクション手数料は0としています。
設定上としている理由は、受け取るLSKから固定量を手数料として差し引いているためです。

・キャンセルトランザクション(password lock cancel transaction)

以下のパラメータを送信することで自身が作成した送信トランザクションをキャンセルできます。

const param = {
  data: {
    asset: {
      data: {
        targetTransactionId: "6257980881051108330"
      }
    },
    ...
  }
}

const tx = new PasswordLockCancelTransaction(param);
キャンセルしたいトランザクションのID(targetTransactionID)を指定するのみです。
キャンセルには手数料がかかります。

・トランザクションの設定

上記の各種トランザクションの設定の一部は設定ファイルとして外だししており、変更可能となっています。

{
   "type": {
       "send": 151,
       "receive": 152,
       "cancel": 153
   },
   "fee": {
       "send": "0.05",
       "receive": "0.01",
       "cancel": "0.01"
   },
   "crypto": {
       "algorithm": "aes-256-cbc",
       "pwdLength": 18,
       "keyLength": 32,
       "ivLength": 16,
       "saltLength": 16,
       "includePlainData": true,
       "usePasswordStrings": "23456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ+-=_&*?@"
   }
}
・type
各種トランザクションのタイプを指定します

・fee
各種トランザクションの実行手数料を指定します

・crypto.pwdLength
生成するパスワードの文字数を指定します

・crypto.includePlainData
送信トランザクションでasset.dataの暗号化後、暗号化していないasset.dataをパラメータに含めるかどうかを指定します。
true:含める / false:含めない
※含める場合、受信トランザクションでのcipherTextの復号結果とasset.dataの突き合わせチェックが実施されます。

・crypto.usePasswordStrings
パスワードに使用する数字、文字、記号を指定します。
※0(ゼロ)とO(オー)、1(イチ)とI(アイ)とl(エル)など見間違い、入力間違いされやすいものを除外しておくのが親切で良いかもしれません。

最後に

Password Lock Transactionにより
「LSKを送りたい相手がLSKアドレスを保有しているかわからない。」
「でも、SNSアカウントやメールアドレスは知っている。」
といった場合に、Liskアドレスを尋ねることなく送信することが可能になると考えています。
相手がLiskアドレスを保有していなくてもLSKを送ることができるため、そこからLiskに興味を持ってもらうことも期待しています。
(メインネットにカスタムトランザクションを載せることが現時点ではできないため、あくまでLisk SDKを使ったカスタムトランザクションの例として紹介するにとどまりますが。。)

ソースコード

password-lock-transaction(github)

デモサイト

PLT Demo

API

Core API
※使用方法は Lisk Core Docs 参照

Lisk関連リンク

Lisk
Lisk Discord
Lisk Japan(非公式)
Lisk 日本語コミュニティDiscord(非公式)


万博おじについて

万博記念公園と新しいものが好きなプログラムやさん
以下で連絡が取れます。
Twitter:@ys_mdmg
github:lisknonanika
Discord:@mdmg

その他加入している非公式コミュニティ
Lisk Japan
・Lisk 情報システム部 (Twitter内グループ)
・Lisk ゲーム部 (Twitter内グループ)

ぶっちゃけお金ないのでください(笑)
Lisk:mdmg(5380827711560203827L)


この記事が気に入ったらサポートをしてみませんか?