主页 > imtoken安全吗 > 基于区块链的微信小程序云笔记(DApp)
基于区块链的微信小程序云笔记(DApp)
一、项目功能概述
微信小程序云笔记的主要功能是写笔记、编辑笔记、查询笔记。 但与传统云笔记不同的是,云笔记并不是存储在传统的关系型数据库(如MySQL)中,而是基于以太坊网络的区块链技术。 也就是说,云笔记会使用Web3.js API将笔记内容保存到以太坊网络,永久保存,不可删除。 但由于云笔记的特殊性以太坊测试链,需要允许修改云笔记的内容。
图1是云笔记的主界面。 界面上有两个按钮:“添加内容”和“查看列表”。 点击“添加内容”按钮进入添加云笔记界面,点击“查看列表”按钮显示笔记列表。
图1
读者可以在添加云笔记页面点击“添加内容”按钮添加几条云笔记,然后在主界面点击“查看列表”按钮,会列出所有云笔记,如图2所示。点击云笔记后面的“状态”按钮,可以查看将云笔记提交到以太坊网络的交易状态。 如果交易被矿工挖出的区块成功保存,“状态”按钮会变成勾号。 由于以太坊网络不会实时处理交易,交易提交后需要一段时间才能得到处理结果。
图 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 测试网络。 如果您不知道如何在以太坊网络上发布智能合约,可以参考本专家课程第九篇:零基础学习区块链与以太坊开发。