###### tags: `SAIGATE` # 吉井さん プライベートチェーン導入 **BlockchainNode**(AWS) https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#InstanceDetails:instanceId=i-0ac74767059cf0dd2 ## 必要事項 1. HTTPポート、IPアドレスでサーバーを指定する。 2. 決済完了(バックエンド側の実装)をトリガーにコントラクトアドレスを指定し、コントラクト内 function savedata を実行する。(引数、呼び出しのアドレス、秘密鍵については下記に記載) ## 接続情報 ### HTTPポート ポート番号:80 ### パブリックIPアドレス 54.178.89.140(IPアドレスは変更の可能性あり) Hardhat、Truffleは使用しない想定です。 通常のHTTP接続でアクセス可能です。 Expressでの叩き方については自分の方では説明できないので、調べていただけると嬉しいです。 ## API概要 **エンドポイント**:savedata(54.178.89.140) **プロトコル**:POST **パラメーター**: **body** ``` { "from" : "ueda", "to" : "hirai", "tokenId" : 1 } ``` **レスポンス** 200 success Example Value ``` { "transactionHash" : '0xdea46a461417e7109bb02a22b41124d9ccea21aa4a17f24add83f98f4bd32f52' } ``` 返ってくるのはトランザクションハッシュと呼ばれる、トランザクションの識別子。 これを使用してトランザクションの内容を後から検証可能。(これに対する機能はない) 400 contract revert **エンドポイント**:get_balance(54.178.89.140) **プロトコル**:GET **パラメーター**: **body** ``` { "owner" : "ueda" } ``` **レスポンス** 200 success Example Value ``` { 1 } ``` 返ってくるのは入力で入れたユーザーネームの残高。 何個NFTを保有しているかがわかる(これに対する機能はない) 400 contract revert **エンドポイント**:get_owner(54.178.89.140) **プロトコル**:GET **パラメーター**: **body** ``` { "tokenId" : "1234" } ``` **レスポンス** 200 success Example Value ``` { "0x084759ac988990876" } ``` 返ってくるのは入力で入れたTokenIDの所有者。 誰が該当のNFTを保有しているかがわかる(これに対する機能はない) 400 contract revert ## コントラクト情報(参考) **Github** https://github.com/saigate-dev/sain_nft_blockchain/blob/main/testnet/contract.sol ### 該当部分 ``` function savedata ( string memory from, string memory to, uint256 tokenId )public { if (balance[from] == 0){ bytes32 datahash = keccak256(abi.encodePacked( from, to, block.timestamp, tokenId )); tokenhistory[tokenId] = Data( from, to, block.timestamp, tokenId ); owners[tokenId] = string(to) ; balance[to] += 1; emit Savedata(from, to, block.timestamp, tokenId, datahash); }else{ bytes32 datahash = keccak256(abi.encodePacked( from, to, block.timestamp, tokenId )); tokenhistory[tokenId] = Data( from, to, block.timestamp, tokenId ); owners[tokenId] = string(to) ; balance[to] += 1; balance[from] -= 1; emit Savedata(from, to, block.timestamp, tokenId, datahash); } } ``` #### WEB3.jsサンプル コントラクトをWEB3から呼び出す際のコントラクト指定のサンプルです。 コントラクトアドレス、アカウントアドレス、ABIに関してはこちらで後ほど共有します。 ``` var Web3 = require('web3'); var web3 = new Web3(); web3.setProvider(new web3.providers.HttpProvider('http://54.178.89.140:8545')); //コントラクトのアドレス var address = "0xd763f8a9681fb8382c72be2c252934cb1c5ba47a"; var account = "0x146df14f0c673f564fe09e7eea6651a66ce049b2"; //ABI var abi = [{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"from","type":"string"},{"indexed":true,"internalType":"string","name":"to","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"datahash","type":"bytes32"}],"name":"Savedata","type":"event"},{"inputs":[{"internalType":"string","name":"owner","type":"string"}],"name":"get_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"get_owner","outputs":[{"internalType":"string","name":"owner","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"get_tokenhistory","outputs":[{"components":[{"internalType":"string","name":"from","type":"string"},{"internalType":"string","name":"to","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"now","type":"uint256"}],"internalType":"struct SaveData.Data","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"from","type":"string"},{"internalType":"string","name":"to","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"savedata","outputs":[],"stateMutability":"nonpayable","type":"function"}] ```