###### 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"}]
```