パイソンと動物相を用いた電報暗号の財布管理の構築


Serverlessアーキテクチャ入門


に関連して書かれたWrite with Fauna Program .
Serverlessなパラダイムはサードパーティサービスをホストアプリケーションに許すソフトウェア設計スタイルです.
サーバーが存在するが、アプリケーション開発プロセスから抽象化されます.
Serverlessなコンピューティングサービスは、しばしば2つのカテゴリーに分類されます:
  • バックエンドサービス
  • 機能性サービス
  • クラウドプロバイダは、Serverlessなアーキテクチャの不可欠な一部です.彼らは開発者のためのすべてのgrunt仕事の世話をするので、アプリケーションの重要なロジックに集中することができます.
    私たちのアプリケーションのデータベース層は- Serverlessデータベースプロバイダで構築されます.それは手動でデータの異常、セキュリティ、およびスケーリングを処理するために使用されていたアプリのコードの層を排除し、あなたのユーザーのためのより良い開発経験とより良いアプリの経験を与えて.

    暗号通貨における暗号


    “クリプト”-ギリシャ語のルート“Kryptos”は、“隠されたか隠し”を意味し、“秘密や隠し”を意味するために使用されています暗号は、暗号通貨の不可欠な部分です.暗号で使用される暗号の3つの異なる方法を見ていきます.
    非対称暗号化:このタイプの暗号化は、データを暗号化するために2つの異なるキーを使用します.公開鍵を公開することができ、誰もがデータを暗号化するために使用することができます.秘密鍵(秘密鍵)は、キーを生成したパーティーにのみ知られていますこれは公開鍵によって暗号化されたデータを解読するのに使用できる唯一のキーです、したがって、名前、公開鍵暗号化.公開鍵から公開キーを取得できません.
    対称暗号化:非対称暗号化とは対照的に、データは暗号化され、同じ暗号鍵を使用して復号化される.キーは同一であるかもしれません、あるいは、それらの間で単純な変化があるかもしれません.データの暗号化と復号化が同じ場所で行われない場合、暗号化の方法は脆弱になります.対称アルゴリズムを用いる場合、鍵交換問題は重要な問題である.
    ハッシュ:ハッシュのデータの整合性を確認するために使用される暗号技術です.ハッシュアルゴリズムはデータの任意の量をとり、ハッシュとして知られている固定出力を返します.入力データのマイナーな変更は出力に重要な影響を与えます.そして、それはハッシュアルゴリズムがデータを検証するのに用いられることができる理由です.

    クリプトカレンシー


    キャッシュを格納する物理的な財布とは対照的に、暗号の財布は実際にあなたの暗号資産を格納しません.クリプトの財布は、例えば、ブロックチェーンとの対話に必要な情報を提供します財布の住所、秘密鍵、公開キー.あなたの財布アドレスはあなたの公開鍵と秘密鍵から生成される英数字の識別子です.これは、ブロックの特定の場所です.暗号化資産を受け取るために他の人とあなたの財布のアドレスを共有することができますが、誰とでもあなたの秘密鍵を共有する必要はありません.
    お客様のプライベートキーは、あなたの資産へのアクセスをブロックチェーンで提供します.

    財布管理アプリケーションの構築


    我々は、トロンブロックチェーンの財布管理アプリケーションに取り組んでいる.このデモでは、電報でそれを構築します.

    要件


  • Python
  • Pythonの電報ボット
  • 電報アカウントと電報ボットトークン
  • トロンビン
  • アプリケーション構造



    env file :このファイルはアプリケーションの秘密を格納します.アプリケーションの秘密

    これらの詳細をあなたのアプリケーションに隠しておくことは重要です.それらの各アプリケーションで使用されます.
    エラー.Py file :このファイルには、アプリケーションで使用されるカスタムPython例外が含まれます.
    キーボード.Py File :我々のアプリケーションのユーザインタフェースのために、我々はTelegramを使用しています:我々は時々カスタムキーボードを作成する必要があります.
    メイン.Py file :このファイルは、我々のアプリケーションが電報に接続するための関数を定義します.
    メッセージ.JSONファイル:アプリのユーザーに送信するメッセージは保存され、このファイルでキュレーションされます.
    UtilsPy file :プロジェクトのコアロジックを含むユーティリティファイルです.
    プロジェクトをクローン化するには、次の手順を実行します.git clone https://github.com/Bamimore-Tomi/fauna-wallet.git .
    すべての要件をインストールします.

    電報との通信


    電報でユーザとコミュニケーションをとるためには、電報ボットを作成する必要がある.電報ボットを作成するには、次の手順に従います.
  • 電報口座を作成する
  • 新しい電報ボットを作成する電報のbotfatherに移動します.あなたが検索してボット父にアクセスすることができます
    電報で
  • type/newbotと送信する
  • プロンプトに従って、あなたが尋ねられる情報を入力してください.最後の結果は、ボットのアクセストークンになります.
  • これで、トークンの値を変更できます.envファイル.前画像で表されるアクセストークンは無効です.それは、説明目的のためにここで示されるだけでした.

    トロンブロックとの通信


    我々は、Bitcoin、Ethereum、およびリップルを含む多数のブロックチェーンに我々のアプリケーションを接続することができます.このデモンストレーションでは、我々はTRONブロックチェーンで動作します.
    私たちがすべての要件をインストールしたとき、tronapiはパッケージの中にありました.

    新しい財布を作る


    我々は、以前にcrypto財布を探検しました.今、我々はどのように財布のアドレス、秘密鍵と公開キーを生成するかを見るでしょう.
    from tronapi import Tron
    tron = Tron()
    account = tron.create_account
    address = account.address
    fernet_key = _generate_fernet_key(os.getenv("MASTER"), os.getenv("SALT"))
    encrypted_private_key = _encrypt_private_key(account.private_key, fernet_key)
    
    我々は、アカウントを作成しましたaccount= tron.create_account 文.アカウントアドレスはaddress 変数.秘密鍵を保護するために、現在フェルネット対称暗号アルゴリズムを採用しています.アルゴリズムに関する詳細な情報は見つかります.秘密鍵を暗号化することは、他の当事者が不正アクセスを行ったとしても、私たちのブロックチェーン資産にアクセスしないように保管する前に秘密鍵を暗号化することが重要です.

    ウォレットバランス


    from tronapi import Tron
    tron = Tron()
    tron.fromSun(tron.trx.get_balance(address))
    

    1つのアドレスからTRXを送る


    def send_trx(sender_private_key: str, reciever_address: str, amount: int):
        fernet_key = _generate_fernet_key(os.getenv("MASTER"), os.getenv("SALT"))
        private_key = _decrypt_private_key(sender_private_key, fernet_key)
        tron = Tron()
        tron.private_key = private_key
        tron.defa3ult_address = tron.address.from_private_key(tron.private_key)["base58"]
        reciever_address = _validate_address(reciever_address)
        balance = get_balance(tron.default_address["base58"])
    
        if balance == 0 or amount > balance:
            raise errors.InsufficientBalance
    
        transaction = tron.trx.send(reciever_address, amount)
    
        return True
    
    このコードセグメントは、秘密鍵の重要性を強化します.この関数は暗号化された秘密鍵を受け取ります.
    キーを保護するためにfernet対称暗号アルゴリズムを使用したことに注意してください.
    これを復号するのに同じアルゴリズムを使用しなければなりません.我々は現在、受信機のアドレスに所望の量を送信するブロックチェーンを要求することができます.私たちがその量を持っているならば、トランザクションは完全です.

    ファウナの設置


    データベースの作成


    ファウナのダッシュボードでは、財布のアプリケーションのデータベースを作成する必要があります.あなたがすでにそうしなかったならば、アカウントを作成してくださいFauna's website .
    ダッシュボードの「新規データベース」ボタンをクリックし、データベースに名前を付け、「保存」ボタンを押します.

    動物のコレクションを作成する


    データベースに集められたデータを保存するには、現在ファウナコレクションを作成する必要があります.
    コレクションは、ユーザーのウォレットに関する情報を含むウォレットコレクションのような、同じプロパティを含むSQLテーブルに似ています.コレクションを作成するには、「新規コレクション」ボタンをクリックします.次に、あなたのコレクションの詳細を記入します.

    動物相インデックスの作成


    データベースコレクションのインデックスを作成する必要があります.ファウナインデックスを使用すると、データベースコレクションに格納されているデータを検索できます.インデックスに移動してNEW_INDEX .
    Terms インデックスを参照できるフィールドを指定します.

    データベースAPIキーの作成


    左ナビゲーションパネルのセキュリティに移動します.クリックSecurity 次にNEW KEY ボタンをクリックし、必要な情報を完了します.

    ときにSAVE APIアクセスキーが生成されます.

    これで、トークンの値を置き換えることができます.envファイル.上記のイメージに示されたアクセストークンは無効です-それはここで説明目的のためだけに示されました.

    動物とのコミュニケーション


    def load_db():
        load_dotenv()
        client = FaunaClient(secret=os.getenv("FAUNA-KEY"))
        return client
    
    これは、データベースとの接続を開始する関数です.CRUD操作を見てみましょう.
    クリエイト
    def create_wallet(client: FaunaClient, user_id: int, wallet_name: str) -> bool:
    
        tron = Tron()
    
        account = tron.create_account
    
        address = account.address
    
        fernet_key = _generate_fernet_key(os.getenv("MASTER"), os.getenv("SALT"))
    
        encrypted_private_key = _encrypt_private_key(account.private_key, fernet_key)
    
        wallet = client.query(
            q.create(
                q.collection("wallet"),
                {
                    "data": {
                        "user_id": user_id,
                        "wallet_name": wallet_name,
                        "encrypted_private_key": encrypted_private_key,
                        "public_key": account.public_key,
                        "wallet_address": dict(address),
                        "wallet_account_balance": 0.0,
                        "transactions": [],
                        "date_generated": time.time(),
                    }
                },
            )
        )
    
        save_wallets(client)
    
        return address.base58
    
    
    続きます.
    def get_wallets(client: FaunaClient, user_id: int, wallet_name: Optional[str] = None):
    
        wallets = client.query(
            q.paginate(q.match(q.index("wallet_index"), user_id), size="100_000")
        )
    
        if len(wallets["data"]) < 1:
            raise errors.WalletNotFound
    
        wallets_data = [
            q.get(q.ref(q.collection("wallet"), wallet.id())) for wallet in wallets["data"]
        ]
    
        wallets_data = client.query(wallets_data)
    
    更新:
    def record_transaction(
        client: FaunaClient, wallet: dict, type_: str, amount: int, address: str, tx_id: str
    ):
    
        tron = Tron()
    
        bot = telegram.Bot(token=os.getenv("TOKEN"))
    
        wallet = get_wallets(client, wallet["user_id"], wallet_name=wallet["wallet_name"])
    
        prev_transactions = wallet["transactions"]
    
        balance = wallet["wallet_account_balance"]
    
        if type_ == "credit":
            balance += amount
    
        if type_ == "debit":
            balance -= amount
    
        new = {
            "type": type_,
            "address": tron.address.from_hex(address).decode(),
            "amount": amount,
            "tx_id": tx_id,
            "time": time.time(),
        }
    
        prev_transactions.append(new)
    
        client.query(
            q.update(
                q.ref(q.collection("wallet"), wallet["ref"]),
                {
                    "data": {
                        "transactions": prev_transactions,
                        "wallet_account_balance": balance,
                    }
                },
            )
        )
    
    削除
    def delete_wallet(client: FaunaClient, user_id: int, wallet_ref: str):
    
        try:
            client.query(q.delete(q.ref(q.collection("wallet"), wallet_ref)))
    
        except NotFound:
            raise errors.WalletNotFound
    
    

    アプリケーションの探索






    結論


    本稿ではServerless Computing Architectureの重要概念を取り上げた.
    また、我々のアプリケーションのデータベース層を管理するために、データベースなしのデータベースプロバイダーであるファウナを使用しました.また、我々はパイソンからの動物相のCRUD操作を調査しました.
    プロジェクトのソースコードはGithub . 何か質問があれば、Twitter経由でご連絡ください