---
title: "Xây dựng todo app với smartcontract"
description: "Đây là một smart contract đơn giản viết trên nền tảng Ethereum bằng ngôn ngữ Solidity. Smart contract này định nghĩa một ứng dụng Todo List"
date: "2023-05-16"
author:
  name: "Nguyen Pham"
  role: "Xin chào. Mình thích lập trình và công nghệ. Đây là blog mình chia sẻ lại các kiến thức về lập trình, công nghệ."
  avatar: "http://0.gravatar.com/avatar/6fb61398e24046b34e13870dd6c357b9?s=128&d=mm&r=g"
category: "Blockchain"
tags: ["Blockchain", "hardhat", "remix", "smartcontract"]
coverImage: "https://2k1.org/wp-content/uploads/2023/05/blockchain-smart-contracts-948x640-1.png"
featured: false
readingTime: "3 min read"
---

# Todo app web3

## Cài đặt môi trường

node 14.19.2

```
$ node -v
v14.19.2
```

ganache desktop  
<https://trufflesuite.com/ganache/>

## Hardhat

### Biên dịch contract

```
yarn compile
```

### Deploy contract local

```
yarn deploy:local
```

### Tạo typechain cho web3

```
yarn compile:web3
```

## Contract

`Todo.sol`

```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract TodoList {
    uint256 public taskCount = 0;
    struct Task {
        uint256 id;
        string content;
        bool completed;
    }

    mapping(uint256 => Task) public tasks;
    event TaskAdded(uint256 id, string content);

    constructor() {
        createTask("Learn smartcontract");
    }

    // function for create task
    function createTask(string memory _content) public {
        taskCount++;
        tasks[taskCount] = Task(taskCount, _content, false);
        emit TaskAdded(taskCount, _content);
    }

    function getTask(uint256 _id) public view returns (Task memory) {
        return tasks[_id];
    }

    function completeTask(uint256 _id) public {
        tasks[_id].completed = true;
    }
}
```

Đây là một smart contract đơn giản viết trên nền tảng Ethereum bằng ngôn ngữ Solidity. Smart contract này định nghĩa một ứng dụng Todo List đơn giản, cho phép người dùng tạo mới một task, xem nội dung của task, và đánh dấu task đã hoàn thành.

Các thành phần chính của smart contract:

- `pragma solidity ^0.8.0;`: Khai báo phiên bản Solidity cần thiết để biên dịch smart contract.
- `contract TodoList { ... }`: Định nghĩa smart contract với tên là TodoList.
- `uint256 public taskCount = 0;`: Biến public `taskCount` lưu trữ số lượng task hiện tại.
- `struct Task { ... }`: Định nghĩa struct Task gồm các thông tin về task bao gồm id, nội dung và trạng thái hoàn thành.
- `mapping(uint256 => Task) public tasks;`: Mapping public `tasks` lưu trữ các task theo id.
- `event TaskAdded(uint256 id, string content);`: Sự kiện public `TaskAdded` được kích hoạt khi một task mới được tạo.
- `constructor() { ... }`: Hàm khởi tạo của smart contract, được gọi khi contract được triển khai. Trong đó sẽ tạo một task mới để thử nghiệm.
- `function createTask(string memory _content) public { ... }`: Hàm public `createTask` cho phép tạo một task mới. Trong đó tạo một task mới, tăng biến `taskCount` lên 1 và kích hoạt sự kiện TaskAdded.
- `function getTask(uint256 _id) public view returns (Task memory) { ... }`: Hàm public `getTask` cho phép xem thông tin của một task dựa trên id. Hàm này trả về một biến kiểu Task và chỉ có thể xem, không thể sửa.
- `function completeTask(uint256 _id) public { ... }`: Hàm public `completeTask` cho phép đánh dấu một task đã hoàn thành. Hàm này sẽ thay đổi trạng thái hoàn thành của task tương ứng trong mapping `tasks`.

Sourcecode

[npv2k1/web3-todo-app: Learn and develop a simple web3 todo app (github.com)](https://github.com/npv2k1/web3-todo-app)
