---
# System prepended metadata

title: 吉井さん　プライベートチェーン導入
tags: [SAIGATE]

---

###### 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サンプル
コントラクトをWEB３から呼び出す際のコントラクト指定のサンプルです。
コントラクトアドレス、アカウントアドレス、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"}]
```

