Code để chứng thực văn bản, tài liệu lên blockchain

Dưới đây là một đoạn mã ví dụ sử dụng Solidity (ngôn ngữ lập trình thông dịch dành cho Ethereum) để tạo một ứng dụng phi tập trung (DApp) liên quan đến công chứng tài liệu trên blockchain Ethereum:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract DocumentNotarization {
    struct Document {
        string name;
        string content;
        address owner;
        uint256 timestamp;
        bool notarized;
    }

    mapping(uint256 => Document) public documents;
    uint256 public documentCount;

    event DocumentAdded(uint256 documentId, string name, address indexed owner, uint256 timestamp);
    event DocumentNotarized(uint256 documentId, string name, address indexed owner, uint256 timestamp);

    function addDocument(string memory _name, string memory _content) public {
        documentCount++;
        documents[documentCount] = Document(_name, _content, msg.sender, block.timestamp, false);
        emit DocumentAdded(documentCount, _name, msg.sender, block.timestamp);
    }

    function notarizeDocument(uint256 _documentId) public {
        require(_documentId <= documentCount, "Invalid document ID");
        Document storage document = documents[_documentId];
        require(document.owner == msg.sender, "You are not the owner of this document");
        require(!document.notarized, "This document is already notarized");

        document.notarized = true;
        emit DocumentNotarized(_documentId, document.name, document.owner, block.timestamp);
    }
}

Trong ví dụ trên, contract DocumentNotarization được sử dụng để quản lý các tài liệu. Mỗi tài liệu được đại diện bởi một cấu trúc Document, bao gồm các thông tin như tên, nội dung, chủ sở hữu, thời gian và trạng thái công chứng.

Các hàm chính bao gồm:

  • addDocument: Hàm này cho phép người dùng thêm một tài liệu mới bằng cách cung cấp tên và nội dung tài liệu.
  • notarizeDocument: Hàm này cho phép chủ sở hữu tài liệu công chứng tài liệu bằng cách chỉ định ID của tài liệu.

Sự kiện được phát ra khi có tài liệu được thêm (DocumentAdded) hoặc công chứng (DocumentNotarized).

Lưu ý rằng đây chỉ là một ví dụ đơn giản và không bao gồm các phần như xác thực người dùng, quyền truy cập và tương tác với giao diện người dùng. Để triển khai và tương tác với DApp trên mạng Ethereum, bạn cần sử dụng các công cụ như Remix IDE, Truffle framework hoặc web3.js.

Thêm vào đó, bạn cần có một đoạn mã HTML và JavaScript đơn giản để tạo giao diện người dùng với một nút nhấn để kết hợp với đoạn mã Solidity đã được cung cấp:

<!DOCTYPE html>
<html>
<head>
    <title>DApp - Document Notarization</title>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
    <h1>Document Notarization DApp</h1>
    <form id="documentForm">
        <label for="name">Document Name:</label>
        <input type="text" id="name" required><br><br>
        <label for="content">Document Content:</label><br>
        <textarea id="content" rows="4" cols="50" required></textarea><br><br>
        <button type="button" onclick="addDocument()">Add Document</button>
    </form>

    <script>
        async function addDocument() {
            const name = document.getElementById('name').value;
            const content = document.getElementById('content').value;

            // Gửi yêu cầu POST tới API để gọi hàm addDocument trong Solidity
            try {
                const response = await axios.post('/api/addDocument', { name, content });
                console.log(response.data);
                alert('Document added successfully!');
            } catch (error) {
                console.error(error);
                alert('Failed to add document.');
            }
        }
    </script>
</body>
</html>

Trong ví dụ trên, chúng ta sử dụng thư viện Axios để thực hiện yêu cầu POST đến API để gọi hàm addDocument trong contract Solidity đã được triển khai.

Để triển khai backend và xử lý yêu cầu từ frontend bên trên, bạn có thể sử dụng một số công nghệ và framework phổ biến như Node.js và Express. Dưới đây là một ví dụ đơn giản về cách triển khai backend để xử lý yêu cầu từ frontend và gọi hàm addDocument trong contract Solidity:

  1. Cài đặt Node.js và npm (Node Package Manager) trên máy tính của bạn nếu chưa có.
  2. Tạo một thư mục mới cho backend và di chuyển vào thư mục đó trong dòng lệnh.
  3. Khởi tạo một dự án Node.js mới bằng cách chạy lệnh sau trong dòng lệnh:csharpCopy codenpm init -y
  4. Cài đặt các gói phụ thuộc cần thiết bằng cách chạy lệnh sau:Copy codenpm install express axios
  5. Tạo một tệp tin index.js trong thư mục backend với nội dung sau:
const express = require('express');
const axios = require('axios');
const app = express();
const port = 3000;

// Địa chỉ và thông tin của contract Solidity
const contractAddress = '<Địa chỉ Contract>';
const contractAbi = <ABI của Contract>;

// Kết nối tới Ethereum node thông qua Infura
const web3Provider = 'https://mainnet.infura.io/v3/<Infura Project ID>';
const Web3 = require('web3');
const web3 = new Web3(web3Provider);

// Kết nối tới contract Solidity
const contract = new web3.eth.Contract(contractAbi, contractAddress);

// Xử lý yêu cầu POST từ frontend để gọi hàm addDocument
app.use(express.json());
app.post('/api/addDocument', async (req, res) => {
    const { name, content } = req.body;

    try {
        // Gọi hàm addDocument trong contract Solidity
        const accounts = await web3.eth.getAccounts();
        const result = await contract.methods.addDocument(name, content).send({ from: accounts[0] });

        console.log(result);
        res.status(200).json({ message: 'Document added successfully!' });
    } catch (error) {
        console.error(error);
        res.status(500).json({ message: 'Failed to add document.' });
    }
});

// Khởi động server
app.listen(port, () => {
    console.log(`Server is running on http://localhost:${port}`);
});

Lưu ý rằng bạn cần thay đổi <Địa chỉ Contract>, <ABI của Contract><Infura Project ID> bằng thông tin thực tế của bạn.

  1. Chạy backend bằng cách chạy lệnh sau trong dòng lệnh:Copy codenode index.js
  2. Backend sẽ được chạy trên http://localhost:3000. Bây giờ, khi bạn nhấp vào nút “Add Document” trên giao diện người dùng frontend, nó sẽ gửi yêu cầu POST đến backend, và backend sẽ gọi hàm addDocument trong contract Solidity.

Lưu ý rằng đây chỉ là một ví dụ đơn giản để giúp bạn hiểu cách triển khai backend. Trong môi trường thực tế, có nhiều yếu tố cần xem xét như bảo mật, xác thực người dùng và xử lý lỗi.

Rate this post

Leave a Reply

Your email address will not be published. Required fields are marked *