スマートコントラクト : LIBRARY SYSTEM


スマートコントラクトを作りましょう！

```solidity:SmartContract_LibrarySystem.sol

pragma solidity ^0.4.18;
contract LibrarySystem {

  struct Book {
    string author;
    string bookName;
    bool borrowed;
  }

  struct Borrower {
    string borrowerName;
  }

  struct Transaction{
    uint bookId;
    uint borrowerId;
    address _;
  }

  mapping (uint => Book) private books;
  mapping (uint => Borrower) private borrowers;
  mapping (uint => Transaction) private transactions;

  uint private bookCounter;
  uint private borrowerCounter;
  uint private transactionCounter;
  
  address private creator;

  constructor() public {
    creator = msg.sender;   
    bookCounter = 0;
    borrowerCounter = 0;
    transactionCounter = 0;
  }

  function addBook(string author, string bookName) public {
    bookCounter++;
    books[bookCounter] = Book(author, bookName, false);
  }

  function returnBook(uint index) public {
    require(books[index].borrowed == true);
    books[index].borrowed = false;
  }

  function borrowBook(uint _bookId, uint _borrowerId) public {
    require(books[_bookId].borrowed == false && 
            bookCounter != 0 &&
            compareStringsByBytes(books[_bookId].bookName, "") == false &&
            compareStringsByBytes(borrowers[_borrowerId].borrowerName, "") == false);
    
    transactionCounter++;
    transactions[transactionCounter] = Transaction(_bookId,_borrowerId,creator);
    books[_bookId].borrowed = true;
  }

  function addBorrower(string name) public {
    borrowerCounter++;
    borrowers[borrowerCounter] = Borrower(name);
  }

  function isBookBorrowed(uint index) public view returns(bool){
    require(compareStringsByBytes(books[index].bookName,"") == false);
    return books[index].borrowed;
  }

  function viewTransactionById(uint index) public view returns(string bookName, string borrowerName, address accountId){
    string memory _bookName = books[transactions[index].bookId].bookName;
    string memory _borrowerName = borrowers[transactions[index].borrowerId].borrowerName;
    return (_bookName, _borrowerName, transactions[index]._);
  }


  function compareStringsByBytes(string string1, string string2) public pure returns(bool){
    bytes memory _s1 = bytes(string1);
    bytes memory _s2 = bytes(string2);
    return keccak256(_s1) == keccak256(_s2);
  }

}

```

3 スタラクを作ります。

本：

```
struct Book {
    string author;
    string bookName;
    bool borrowed;
  }
```

スタラクをモデルするために、必要な情報を作りました：
author: 本の著者。
bookName: 本のための名前
borrowed: 本のステータス (　本の可用性を示すためです。）


ボロワ：

```
struct Borrower {
    string borrowerName;
  }
```

ここは１属性だけがあります：
borrowerName: 借り手のための名前

トランザクション:

```
struct Transaction{
    uint bookId;
    uint borrowerId;
    address _;
  }
```

このスタラクは本とボロワの両方のためのテーブルのように機能します。
追跡目的のためには、送信者を貯めます。

```
  mapping (uint => Book) private books;
  mapping (uint => Borrower) private borrowers;
  mapping (uint => Transaction) private transactions;

  uint private bookCounter;
  uint private borrowerCounter;
  uint private transactionCounter;

  address private creator;
```


このセクションでヴァリャボルをつくります：
• スタラクのリストを貯めるためのヴァリャボルがあります。
• 追跡のためのカオンタがあります。
• 住所を貯めるためのヴァリャボルがあります。

```
constructor() public {
    creator = msg.sender;   
    bookCounter = 0;
    borrowerCounter = 0;
    transactionCounter = 0;
  }
```

このコンストラクターで送信者を初期化された。
また、カオンタヴァリャボルにゼロを初期化された。


```
  function compareStringsByBytes(string string1, string string2) public pure returns(bool){
    bytes memory _s1 = bytes(string1);
    bytes memory _s2 = bytes(string2);
    return keccak256(_s1) == keccak256(_s2);
  }
```

このファンクションはバイトによって2ステリングを比較するためには、KECCAK256を使します。
だから、ボリャン価値をお返することができます。


```
function addBook(string author, string bookName) public {
    bookCounter++;
    books[bookCounter] = Book(author, bookName, false);
  }
```

このファンクションは、本を追加するために2の文字列パラメータを取ります。 ブックカウンタはインクリメントされます。 新しい本を作成する際にインデックスとして使用されます。


```
  function returnBook(uint index) public {
    require(books[index].borrowed == true);
    books[index].borrowed = false;
  }
```

このファンクションは本を返すためのものです。その本が借用されている場合は、本の借用状況をfalseに設定します。

```
  function borrowBook(uint _bookId, uint _borrowerId) public {
    require(books[_bookId].borrowed == false && 
            bookCounter != 0 &&
            compareStringsByBytes(books[_bookId].bookName, "") == false &&
            compareStringsByBytes(borrowers[_borrowerId].borrowerName, "") == false);
    
    transactionCounter++;
    transactions[transactionCounter] = Transaction(_bookId,_borrowerId,creator);
    books[_bookId].borrowed = true;
  }
```

このファンクションは本を借用するための機能です。 それは、本のIDと借り手をパラメータとして取ります。 その本が借用されていないかどうかをチェックします。 また、借り手と本が存在するかどうかを確認します。 その後、トランザクションに追加されます。 最後に、本は借用に設定されます。


```
  function addBorrower(string name) public {
    borrowerCounter++;
    borrowers[borrowerCounter] = Borrower(name);
  }
```

このファンクションは、借り手を追加するための機能です。 それはパラメータとして名前をとる。 借り手のカウンターをインクリメントし、インデックスを使用して新しい借り手を追加します。



```
  function isBookBorrowed(uint index) public view returns(bool){
    require(compareStringsByBytes(books[index].bookName,"") == false);
    return books[index].borrowed;
  }
```

このファンクションは、書籍が借用されているかどうかを確認するためのものです。 チェックされている本が存在するかどうかをチェックし、ブール値を返します。


```
  function viewTransactionById(uint index) public view returns(string bookName, string borrowerName, address accountId){
    string memory _bookName = books[transactions[index].bookId].bookName;
    string memory _borrowerName = borrowers[transactions[index].borrowerId].borrowerName;
    return (_bookName, _borrowerName, transactions[index]._);
  }
```

このファンクションは、インデックスでトランザクションを表示するための機能です。 書籍名と借り手名を文字列メモリに設定します。


アプリケーションは終わりました