主页 > imtoken安全吗 > 基于区块链的微信小程序云笔记(DApp)

基于区块链的微信小程序云笔记(DApp)

imtoken安全吗 2023-02-24 06:09:48

一、项目功能概述

微信小程序云笔记的主要功能是写笔记、编辑笔记、查询笔记。 但与传统云笔记不同的是,云笔记并不是存储在传统的关系型数据库(如MySQL)中,而是基于以太坊网络的区块链技术。 也就是说,云笔记会使用Web3.js API将笔记内容保存到以太坊网络,永久保存,不可删除。 但由于云笔记的特殊性以太坊测试链,需要允许修改云笔记的内容。

图1是云笔记的主界面。 界面上有两个按钮:“添加内容”和“查看列表”。 点击“添加内容”按钮进入添加云笔记界面,点击“查看列表”按钮显示笔记列表。

enter image description here

图1

读者可以在添加云笔记页面点击“添加内容”按钮添加几条云笔记,然后在主界面点击“查看列表”按钮,会列出所有云笔记,如图2所示。点击云笔记后面的“状态”按钮,可以查看将云笔记提交到以太坊网络的交易状态。 如果交易被矿工挖出的区块成功保存,“状态”按钮会变成勾号。 由于以太坊网络不会实时处理交易,交易提交后需要一段时间才能得到处理结果。

enter image description here

图 2

2. 编写并测试云笔记智能合约

由于云笔记需要将笔记内容保存到以太坊网络中,因此需要编写合约。 通过合约中的功能保存备注内容,修改和查询备注内容。

云笔记合约的基本思想是将云笔记的内容保存到合约中的映射(mapping)变量(data)中。 由于合约的成员变量默认以store的形式存储,映射中的所有数据将永久存储在区块链上。

下面的代码编写了一个名为 CloudNoteService 的智能合约,用于提供云笔记服务。 在这个合约中,通过addNote函数添加注释,通过updateNote函数更新注释,通过getNote函数获取注释内容。

// CloudNoteService.sol
pragma solidity ^0.4.20;
//  用于服务云笔记的合约
contract CloudNoteService 
{
    //  用于保存每篇云笔记,key:笔记的标题   value:笔记的内容
    mapping(string => string) private note;
    //  用于保存所有账户的云笔记,key:用户ID  value:key指定用户的所有云笔记
    mapping(string => mapping(string => string) ) private data;
    //  添加云笔记,id:用户ID, name:笔记标题(名称),content:笔记内容
    function addNote(string id, string name, string content) public
    {
        //  用户ID不能为空,由于Solidity语言中string类型的值不能直接比较,
        //  所以使用keccak256函数将string类型的值转换为bytes32类型的值
        //  在进行比较
        require(keccak256(id) != keccak256(""), "id不能为空 ");
        //  笔记标题不能为空
        require(keccak256(name) != keccak256(""), "name不能为空 ");
        //  笔记内容不能为空
        require(keccak256(content) != keccak256(""), "content不能为空 ");
        //  同一个账户下,云笔记名称不能相同
        require(keccak256(data[id][name]) ==  keccak256(""), "note已经存在!");
        //  将笔记内容添加到到data变量中
        data[id][name] = content;
    }
    //  更新云笔记的内容,参数与addNote函数的参数相同 
    function updateNote(string id, string name, string content) public
    {
        require(keccak256(id) != keccak256(""), "id不能为空 ");
        require(keccak256(name) != keccak256(""), "name不能为空 ");
        require(keccak256(content) != keccak256(""), "content不能为空 ");
        //  云笔记必须存在,才能修改
        require(keccak256(data[id][name]) != keccak256(""),"note不存在!");
        //  修改云笔记中的内容
        data[id][name] = content;
    }
    //  根据用户ID和云笔记名称获取云笔记内容。如果没有该云笔记,返回空串
    function getNote(string id, string name) view public returns(string)
    {
        return data[id][name];
    }
}

3.将CloudNoteService合约部署到以太坊网络

将 CloudNoteService 合约部署到以太坊网络在本节中,CloudNoteService 合约将部署到以太坊网络。 首先,使用Chrome浏览器的MetaMask插件登录账户(需要输入创建账户时指定的账户密码),如果读者在以太坊主网上有足够的以太币以太坊测试链,可以选择以太坊主网。 但是,对于大多数读者来说,没有以太币,只能选择Ropsten测试网,免费申请几个以太币。 在此示例中,选择了 Ropsten 测试网络。 如果您不知道如何在以太坊网络上发布智能合约,可以参考本专家课程第九篇:零基础学习区块链与以太坊开发。