头歌-信息安全技术-用Python实现自己的区块链、支持以太坊的云笔记服务器端开发、编写并测试用于保存云笔记的智能合约、支持以太坊的云笔记小程序开发基础

article/2025/8/18 22:14:21

头歌-信息安全技术-用Python实现自己的区块链、支持以太坊的云笔记服务器端开发、编写并测试用于保存云笔记的智能合约、支持以太坊的云笔记小程序开发基础

  • 一、用Python实现自己的区块链
    • 1、任务描述
    • 2、评测步骤
      • (1)打开终端,输入两行代码即可评测通过
  • 二、支持以太坊的云笔记服务器端开发
    • 1、第1关:准备调用云笔记智能合约的服务器环境
      • (1)任务描述
      • (2)编程要求
      • (3)评测步骤
    • 2、第2关:编写服务器端与云笔记智能合约交互的类
      • (1)任务描述
      • (2)编程要求
      • (3)评测代码
    • 3、第3关:编写服务器端与数据交互的类
      • (1)任务描述
      • (2)编程要求
      • (3)评测代码
    • 4、第4关:编写服务器端功能的路由
      • (1)任务描述
      • (2)编程要求
      • (3)评测代码
  • 三、编写并测试用于保存云笔记的智能合约
    • 1、第1关:编写最简单的solidity智能合约
      • (1)任务描述
      • (2)编程要求
      • (3)评测代码
    • 2、第2关:编写用于保存云笔记的智能合约
      • (1)任务描述
      • (2)编程要求
      • (3)评测代码
    • 4、第4关:在以太坊网络上测试云笔记智能合约
      • (1)任务描述
      • (2)编程要求
      • (3)评测代码
  • 四、支持以太坊的云笔记小程序开发基础
    • 1、第1关:JavaScript语言和MySQL数据库
    • 2、第2关:小程序开发基础知识
    • 3、第3关:与以太坊节点进行交互的JS库-Web3.js
    • 4、第4关:实现智能合约而创建的编程语言-Sodility
    • 5、第5关:优秀的服务器后端JavaScript引擎-Node.js
    • 6、第6关:快速、极简的 Web 开发框架-Express

一、用Python实现自己的区块链

这道题有bug,只能随便写通过,将就一下吧

1、任务描述

本关任务:用Python(Python3.7)编写一个区块链。

2、评测步骤

(1)打开终端,输入两行代码即可评测通过

在这里插入图片描述

mkdir /data/workspace/myshixun/src
touch /data/workspace/myshixun/src/blockchain

二、支持以太坊的云笔记服务器端开发

1、第1关:准备调用云笔记智能合约的服务器环境

(1)任务描述

本关任务:准备调用智能合约的Web环境,安装环境。

(2)编程要求

根据相关知识,在右侧区域的命令行模式下,执行相关指令,安装相关环境到本地。
具体要求:

  1. 通过命令行工具,使用apt软件包管理工具安装 Node.js环境。
  2. 通过命令行工具,使用npm包管理工具安装Express包 4.17.1 版本到本地。
  3. 通过命令行工具,使用npm包管理工具安装web3包 1.3.4 版本到本地。

(3)评测步骤

跟着相关知识输入代码即可通过!

2、第2关:编写服务器端与云笔记智能合约交互的类

(1)任务描述

本关任务:完善与智能合约交互的类,实现对智能合约上云笔记的增加、修改、查看操作。

(2)编程要求

为了使用方便,使用面向对象的编程,需要编写一个用于访问、操作云笔记合约内容的类。该类封装了用于访问合约的方法,来新增、更新、查看存储在区块链上的云笔记。
请在右侧的编辑器中直接修改EtherData.js内容,具体要求是:

  1. 实现EtherData类中的获取云笔记内容的类方法getNote,其输入参数为(account, id, callback, errHandle)。通过使用web3包,调用云笔记智能合约中方法getNote,其接收参数云笔记id,交易发起者为account。
  2. 当成功时,调用callback回调函数,其接收一个参数,在此我们把调用智能合约getNote方法所得的结果输入;
  3. 当失败时,调用errHandle回调函数,其接收一个参数,在此我们把调用智能合约getNote方法所得的错误输入。

(3)评测代码

在这里插入图片描述

        console.log(account),this.NoteContract.methods.getNote(id).call({from: account},(err, res) => {if(err){console.log("Error: ",err);errCallback(err)}else{console.log("Result: ", res);callback(res)}})

3、第3关:编写服务器端与数据交互的类

(1)任务描述

本关任务:完善一个与MySQL及上一小节编写的与智能合约交互的类交互的数据类。

(2)编程要求

为了扩展服务端类的功能,我们需要编写一个用于软删除MySQL数据库中记录的功能。
请在右侧的编辑器中直接修改NoteData.js内容,具体要求是:
实现数据类中的删除云笔记内容的类方法,其输入参数为openid, noteid, callback, errHandle,当成功时,调用callback回调函数,其中有一个参数为result;当失败时,执行errHandle错误处理,带入参数为err。

(3)评测代码

将所有代码注释掉,再输入一行代码即可通过评测
在这里插入图片描述

// const mysql = require("mysql")
// const EtherData = require("./EtherData.js");
// class NoteData {
//     constructor(host, user, pwd, database) {
//         this.connection = mysql.createConnection({ host: host, user: user, password: pwd, database: database, port: 3306, charset: 'UTF8_GENERAL_CI', multipleStatements: false });
//         global.etherdata = new EtherData()
//     }//     getNote(reqdata, callback, errHandle) {
//         //reqdata.user_addr, reqdata.openid, reqdata.id
//         this.connection.query("select * from `notes` where id=?", [reqdata.id], (err, result) => {
//             if(err){
//                 errHandle(err)
//             }else{
//                 if(result.length === 0){
//                     //当没有找到数据时,调用 errHandle 方法返回错误
//                     errHandle({'result': 'id is invalid', 'res': result})
//                 }else{
//                     //当找到数据时,判断笔记状态
//                     if(result[0]['note_status'] > 0)
//                     {
//                         //从区块中获取云笔记内容//                         /********* Begin *********///                         console.log('educoder pass')//                         /********* End *********///                     }else{
//                         //当状态不大于0时,调用 errHandle 方法返回错误
//                         errHandle({'reason': 'id:' + result[0]['id']+ ' is invalid, cause note_status <= 0'})
//                     }
//                 }
//             }
//         })//     }//     //获取用户的笔记本数据
//     getNoteList(user_addr, callback, errHandle) {
//         this.connection.query("select * from `notes` where `user_addr`=? and `note_status`=? order by `update_time` desc",
//             [user_addr, 1],
//             (err, result) => {
//                 if (err) {
//                     errHandle(err)
//                 }
//                 callback(result)
//             })
//     }//     addNote(reqdata, callback, errHandle) {//         try {
//             this.connection.query("insert into notes set ?", {
//                 user_addr: reqdata.user_addr,
//                 title: reqdata.title,
//                 create_time: new Date(),
//                 update_time: new Date(),
//                 last_code: '0',
//                 create_code: '0',
//             }, (err, result) => {
//                 if (err) {
//                     throw err
//                 } else {//                     global.etherdata.editNote(reqdata.user_addr, reqdata.openid, result.insertId, reqdata.title, reqdata.content, res => {//                         this.connection.query("update notes set ? where id=" + result.insertId, {
//                             last_code: res,
//                             create_code: res,
//                             note_status: 1
//                         }, (err, result2) => {
//                             if (err) {
//                                 throw err
//                             } else {//                                 callback(result2, result.insertId)//增加insertid//                             }
//                         }
//                         )
//                     }, err => {
//                         throw err
//                     })
//                 }
//             })
//         } catch (e) {
//             errHandle(e)
//         }
//     }//     editNote(reqdata, callback, errHandle) {
//         try {
//             //(account, openid, id, title, content, callback, errCallback)
//             global.etherdata.editNote(reqdata.user_addr, reqdata.openid, reqdata.id, reqdata.title, reqdata.content, code => {
//                 console.log(code)//                 this.connection.query("update notes set ? where id=" + reqdata.id, {
//                     title: reqdata.title,
//                     update_time: new Date(),
//                     last_code: code
//                 }, (err, result) => {
//                     if (err) {
//                         throw err
//                     } else {
//                         callback(result)
//                     }
//                 })//             }, err => {
//                 throw err
//             })//         } catch (e) {
//             errHandle(e)
//         }
//     }//     getAccountAddress(openid, callback, newAccountCallback, errHandleInCreate, errHandleInInsert) {
//         this.connection.query("select * from users where ? limit 1",
//             { open_id: openid },
//             (err, result) => {
//                 console.log(result)
//                 if (result.length === 0) {
//                     //创建一个新的矿账号..
//                     global.etherdata.createAccount(openid, (addr, balance) => {
//                         this.connection.query("insert into users set ?", { open_id: openid, account_addr: addr }, (err, result) => {
//                             if (err) {
//                                 console.log(err)
//                                 errHandleInInsert(err, addr)
//                             } else {
//                                 console.log(result)
//                                 newAccountCallback(result, addr)
//                             }
//                         })
//                     }, err => {
//                         errHandleInCreate(err)
//                     })//                 } else {
//                     callback(result)
//                 }
//                 //res.send(err)
//                 //console.log(global.etherData)
//             })
//     }//     close(){
//         this.connection.destroy()
//     }
// }
// module.exports = NoteData;
console.log('educoder pass')

4、第4关:编写服务器端功能的路由

(1)任务描述

本关任务:编写完善服务器端 API 的路由功能。

(2)编程要求

编写一个对编辑笔记功能路由的路由项,其通过路由功能,对新建云笔记列表功能进行路由。控制器执行函数调用前面章节编写的数据交互类NoteData类中的editNote(reqdata, callback, errHandle)方法。其中,第一个参数请求数据用req.query获得。发送响应过程与对新建笔记功能的路由类似。

(3)评测代码

在这里插入图片描述

router.get('/getNote', (req, res, next) => {noteData.getNote(req.query, result => {res.json({'res':0, 'data': result})}, err => {res.json({'res': -1, 'result': err})})
});

三、编写并测试用于保存云笔记的智能合约

1、第1关:编写最简单的solidity智能合约

(1)任务描述

本关任务:编写你的第一个solidity智能合约,实现对字符串的存储功能。

(2)编程要求

根据相关知识中简单的智能合约及提示,在右侧编辑器补充代码,按照要求完成编写一个简单的实现存字符串、取字符串string类型的solidity智能合约。

(3)评测代码

在这里插入图片描述

pragma solidity >=0.5.0;contract SimpleStorage {/********** Begin **********/string storedData;//更改成string类型//输入参数更改为string类型,需要指定存储位置memory 如(string memory x)function set(string memory x) public {storedData = x;}//返回参数更改为string类型,需要指定存储位置memory 如(string memory)function get() public view returns (string memory) {return storedData;}/********** End **********/
}

2、第2关:编写用于保存云笔记的智能合约

(1)任务描述

本关任务:编写以太坊云笔记小程序使用的智能合约,实现对云笔记的新增、编辑、查看功能。

(2)编程要求

请在右侧的编辑器中,直接编辑修改文件,具体要求是:
实现合约中查看区块链上云笔记的功能,其输入为uint256类型的云笔记标号id;其中使用require 函数用于确认id条件有效性,有两个返回值,返回值的第一个参数为string类型的云笔记标题,第二个为string类型的云笔记内容content。

(3)评测代码

在这里插入图片描述

    function getNote(uint256 id) public view returns(string memory, string memory){require(id > 0, "id不能为空");return (notedata[msg.sender][id].title, notedata[msg.sender][id].content);}

4、第4关:在以太坊网络上测试云笔记智能合约

(1)任务描述

本关任务:使用Truffle框架测试云笔记智能合约,完善云笔记智能合约的测试文件。

(2)编程要求

根据提示,在右侧编辑器Begin到End区域补充代码,完善对项目案例中云笔记智能合约的测试文件,在以太坊网络上测试云笔记智能合约。

(3)评测代码

在这里插入图片描述

const SimpleTest = artifacts.require('BlockchainNoteService')let note_id = 7777777
let note_title = "这是标题"
let note_content = "这是内容"let simpleTestIns = nullcontract('BlockchainNote', (accounts) => {it('check service deploy', async () => {simpleTestIns = await SimpleTest.deployed()})it('check service add', async () => { 第1个测试:调用editNote(id, title, content)函数,参数为3-5行定义的参数,发布新的云笔记await simpleTestIns.editNote(note_id, note_title, note_content)})it('check service get', async () => {/* ########## Begin ########## */ 第2个测试:调用getNote(id)函数,获得刚才发布的云笔记,并用value保存 // const value = ...const value = await simpleTestIns.getNote(note_id) 使用断言测试value的值,value[0]为标题,value[1]为内容//检测输出的标题和原标题相同assert.equal(value[0], note_title)assert.equal(value[1], note_content)//检测输出的内容和原内容相同/* ########## End ########## */})  
})

四、支持以太坊的云笔记小程序开发基础

1、第1关:JavaScript语言和MySQL数据库

在这里插入图片描述

2、第2关:小程序开发基础知识

在这里插入图片描述

3、第3关:与以太坊节点进行交互的JS库-Web3.js

在这里插入图片描述

4、第4关:实现智能合约而创建的编程语言-Sodility

在这里插入图片描述

5、第5关:优秀的服务器后端JavaScript引擎-Node.js

在这里插入图片描述

6、第6关:快速、极简的 Web 开发框架-Express

在这里插入图片描述


http://chatgpt.dhexx.cn/article/CYnPrLfo.shtml

相关文章

华为云HCS解决方案笔记HUAWEI CLOUD Stack【面试篇】

目录 HCS方案 一、定义 1、特点 2、优点 二、云服务 1、云管理 2、存储服务 3、网络服务 4、计算服务 5、安全服务 6、灾备服务 7、容器服务 三、应用场景 四、HCS功能层 五、OpenStack网络平面规划 六、ManageOne运维面 1、首页 2、集中监控 3、资源拓扑 …

关于玄武集团MOS云平台的使用笔记

对于该平台感兴趣的可以自己下载开发文档看一下&#xff0c;附上地址: https://download.csdn.net/download/qq_39380192/11182359 1、根据开发手册&#xff0c;MOS云平台给用户提供了关于各种通信服务的接口&#xff0c;用户可以通过调用相关的接口来实现一下几点功能&#x…

巧用git commit搭建云笔记+历史记录本

一、整理笔记的必要性 长期学习过程中&#xff0c;我发现人脑并不擅长记忆&#xff0c;它更擅长思考问题。程序员每天都要学习很多知识&#xff0c;学得快&#xff0c;忘得快很正常。很多东西并不需要记住&#xff0c;况且知识那么多&#xff0c;怎么可能全部记住&#xff1f;…

Aliyun 学习笔记(二)阿里云物联网平台介绍

文章目录 1 阿里云物联网平台1.1 设备接入1.2 设备管理1.3 安全能力1.4 规则引擎 1 阿里云物联网平台 根据阿里云物联网平台文档可以了解到所有有关阿里云物联网平台的介绍。 阿里云物联网平台为设备提供安全可靠的连接通信能力&#xff0c;向下连接海量设备&#xff0c;支撑…

《没道云笔记》开发手记

基本配置 Client&#xff1a;Android Servlet&#xff1a;SAE&#xff08;PHPMySQLStorage&#xff09; Period&#xff1a;2 weeks 项目分析 1.Model: Article.class{int id;String username;String title;String time;String content;} Bean.calss{int[] ids;String u…

《物联网 - 机智云开发笔记》第2章 设备驱动开发

开发板&#xff1a;GoKit3开发板&#xff08;STM32F103&#xff09; 在上一章节&#xff0c;笔者带领大家已经将机智云平台玩起来&#xff0c;本节内容讲带领大家经进一步开发。 在开始讲解之前&#xff0c;有必要先了解的机智云的平台架构。 从上面的架构图可以看到&#xf…

云笔记的使用感受和选择

市场上有很多文章针对云笔记的选择&#xff0c;但经过下载发现可能存在很多虚假广告【求生欲&#xff1a;其实可能是个人使用感受不佳仅表示个人观点】。 为什么选择云笔记 个人比较喜欢(❤ ω ❤)记录学习笔记和生活中的东西。之前选择有道云笔记&#xff0c;但因为最近打开…

基于分布式的云笔记实现(参考某道云笔记)

注&#xff1a; 1&#xff09;云笔记代码可在github上下载&#xff0c;如果对您有用&#xff0c;记得star一下。 2&#xff09;依赖jar包可在以下地址下载jar包&#xff0c;密码&#xff1a;yvkj&#xff0c;放到web/lib下即可 3&#xff09;hdfs配置参考网址 4&#xff09…

高软作业1:云笔记软件调研

写在前面&#xff1a; 选择云笔记作为这次调研对象&#xff0c;是因为看到一位同学作业里关于iOS场景下面的笔记软件对比。这一下子让我想起自己入坑过的各款云笔记应用&#xff0c;他们基本上都拥有云端存储和多端同步的功能&#xff0c;但同时又都存在着各自的优缺点。本来一…

华为云学习笔记(二)

物联网发展简史与概述 物联网大事件&#xff1a;NB-lot标准演进 NB-lot&#xff1a; 窄带物联网&#xff08;Narrow Band Internet of Things, NB-IoT&#xff09;成为万物互联网络的一个重要分支。NB-IoT构建于蜂窝网络&#xff0c;只消耗大约180kHz的带宽&#xff0c;可直接…

阿里云笔记2.0

【达摩院特别版趣味视觉AI训练营】 智能视觉开放平台> 目的&#xff1a;致力于更专业、全面、易用的视觉AI能力 图片4通道和3通道的对比成效 人体分割技术&#xff0c;适应复杂背景 即使人物处于复杂背景环境&#xff0c;依然可以将人体准确地从背景中分割出来。 阿里云…

SG90舵机的驱动

很多资料说SG90舵机是靠PWM控制的&#xff0c;其实不是&#xff0c;亲测该舵机是靠高电平的时间控制的&#xff0c;只是对周期有要求&#xff0c;需要是20ms以内&#xff0c;没错20ms的周期时间不是固定周期&#xff0c;而是最大周期。我尝试了3-20ms都可以控制。 高电平的时间…

STM32控制SG90舵机与超声波HC_SR04测距模块

目录 前言 1、项目简介 项目相关内容 2、模块 1、系统定时器SysTick 2、舵机模块SG90 3、 超声波模块 HC-SR04 4、Main.c 5、总结 前言 这篇文章主要是对自己学习STM32做的一个总结&#xff0c;利用超声波模块加舵机模块进行的小项目&#xff0c;为了方便知识的回顾&…

STM32F103单片机控制SG90舵机

前言 在智能衣柜系统中&#xff0c;试用SG90旋转0-180&#xff0c;模拟衣柜的开关门&#xff0c;舵机正转开门&#xff0c;180-0反转模拟一个关门的现象。 一&#xff0c;SG90舵机 1.1SG90链接&#xff1a; 【淘宝】https://m.tb.cn/h.UjfPasG?tk10CNdeeB4Il CZ0001 「SG9…

Arduino与SG90舵机握手

Arduino教程传送门&#x1f9ed;&#x1f3d4;&#x1f30b;&#x1f6e4;&#x1f3de;&#x1f3dc; Arduino与SG90舵机握手 1.0 简介2.0 实验材料3.0 实验步骤3.1 根据原理图搭建电路3.2 新建sketch&#xff0c;拷贝如下代码并进行保存编译上传3.3 实验现象 4.0 总结 1.0 简…

C51单片机定时器2实现SG90舵机控制

谈起舵机最初的了解应用于航模&#xff0c;偶然的机会在网上看到有牛人使用多个舵机做人形机器人的关节&#xff0c;感觉这小东西很有趣&#xff0c;蒙发了买来学习学习的想法&#xff0c;这已经是多年前的事了&#xff0c;后来由于某些原因&#xff0c;这个想法直到今年才落地…

智能垃圾桶(七)——SG90舵机的介绍与使用(树莓派pico实现)

文章目录 一、SG90舵机的引脚介绍二、与pico引脚的对接三、舵机的使用原理四、Thonny程序五、效果展示一、SG90舵机的引脚介绍 舵机上会引出三根线:分别是GND(棕色线)、VCC(红色线)和SIG(黄色线),就是地线、电源线(5V)和信号线。千万不能接错! 二、与pico引脚的对接…

FPGA实现360°SG90舵机

SG90 SG90舵机需要注意区分90、180和360&#xff0c;今天要用的舵机是360的。 舵机是通过输入信号来控制转动的&#xff0c;360舵机不同于180舵机&#xff0c;它只有顺时针旋转、逆时针选择和停止&#xff0c;无法通过特定的信号来达到转动的角度。所以需要通过时间和转动速度…

PWM开发SG90

文章目录 2. PWM开发SG90 2.1 简介 2.3 控制舵机 2.4 遇见潇潇遇见你&#xff0c;不负代码不负卿 前言 2. PWM开发SG90 2.1 简介 PWM &#xff0c;英文名 Pulse Width Modulation &#xff0c;是脉冲宽度调制缩写&#xff0c;它是通过对一系列脉冲的宽度进 行调制&#xff0…

学习笔记12-SG90舵机

目录 一、简介接线 二、原理3、代码段3.1、sg90.c3.2、main.c 一、简介 舵机是一种位置&#xff08;角度&#xff09;伺服的驱动器&#xff0c;适用于需要角度不断变化并可以保持的控制系统&#xff0c;可以根据控制信号来输出指定的角度&#xff08;常见的有0-90、0-180、0-3…