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

news2025/1/12 3:03:42

头歌-信息安全技术-用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 = null

contract('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://www.coloradmin.cn/o/24841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL的高阶学习:索引、B+树

1.索引 索引是一种数据结构&#xff0c;如果没有索引&#xff0c;查找一个数据就需要从第一页开始全局检索直至找到需要的数据&#xff0c;有了索引可以先在目录中根据拼音查找到该数据所在的页数&#xff0c;因此通过索引可以大大减少了查询时间。 索引有两种存储类型&#xf…

金融科技赋能 互融云手机回租系统 实现资产全流程在线运营管理

在共享单车、充电宝等共享商业的兴起与成熟之后&#xff0c;“信用租赁”的模式悄然诞生&#xff0c;租房、租衣、租数码等已成常态。信用租赁系统的出现&#xff0c;带活了一大批租赁经济&#xff0c;尤其是手机行业。 伴随手机零售业的增长以及新品发布速度的提高&#xff0…

CY8C5888AXQ-LP096 CY8C5888AXI-LP096,IC MCU 32BIT

PSoC 5LP是一种真正的可编程嵌入式片上系统&#xff0c;集成了可配置的模拟和数字外设&#xff0c;内存和单芯片上的微控制器。PSoC 5LP架构通过以下方式提高性能&#xff1a; 32位Arm Cortex-M3核心加上DMA控制器和数字滤波处理器&#xff0c;最高可达80mhz 超低功率&#xff…

China SAFe Day 2022中国规模化敏捷大会圆满落幕!

China SAFe Day 202211月5日&#xff0c;2022 China SAFe Day暨第三届中国规模化敏捷大会在上海圆满落幕。 本届大会由Scrum中文网和SAI&#xff08;Scaled Agile Inc.&#xff09;联合主办&#xff0c;围绕 “敏捷企业与数字化变革” 这一主题展开&#xff0c;内容涵盖工业敏…

RSA加密原理与RSA公钥加密系统、数字签名

通过公钥加密系统&#xff0c;可以对传输于两个通信单位之间的消息进行加密&#xff0c;即使窃听者窃听到加密之后的消息&#xff0c;也不能对其破译。 1、RSA公钥加密原理 1.1 几个核心概念 公钥P与公钥函数P()密钥S与密钥函数S() 可以简单理解&#xff0c;一个公钥对应一个…

【数据结构】—— 单链表的增删改查

❤️一名热爱Java的大一学生&#xff0c;希望与各位大佬共同学习进步❤️ &#x1f9d1;个人主页&#xff1a;周小末天天开心 各位大佬的点赞&#x1f44d; 收藏⭐ 关注✅&#xff0c;是本人学习的最大动力 感谢&#xff01; &#x1f4d5;该篇文章收录专栏—数据结构 目录 方…

BUUCTF web之随便注

启动靶场访问如下&#xff0c;输入1&#xff0c;报错&#xff0c;可知是字符型注入&#xff0c;变量由单引号包裹 输入1 and 11 --&#xff0c;显示正常 先直接用sqlmap注入一下&#xff0c;显示存在注入&#xff0c;但是始终注入不出来数据库&#xff0c;“[ERROR] unable to …

Arnold渲染器适合什么样的电脑配置

Arnold 是 Solid Angle 和 Sony Pictures Imageworks 联合打造的顶级光线追踪 3D 渲染器。该程序是 Sony Imageworks 的主要渲染器&#xff0c;被全球 300 多家工作室使用。Arnold 6.0 及更高版本支持 GPU 渲染。Arnold GPU 的硬件建议是什么&#xff1f; 1. Arnold GPU 硬件推…

OpenKylin适配和虚拟打印机

最近在测国产OS客户端部分。首先客户端程序在CentOS全部使用没毛病&#xff0c;但是CentOS桌面体验比较差。然后就试了UOS&#xff0c;在UOS上测试到打印这块花了很多时间&#xff0c;碰到问题是CUPS有反应&#xff0c;但是没生成PDF文件&#xff0c;各种试了好久没解决。就寻思…

Android:单Activity多Fragment,Navigation实现Fragment跳转,Fragment之间通过ViewModel共享数据

单Activity多Fragment&#xff0c;Navigation实现Fragment跳转&#xff0c;Fragment之间通过ViewModel共享数据1、MainActivity2、HomeFragment, DetailFragment2.1、HomeFragment2.2、DetailFragment3、MyViewModel参考1、MainActivity 1、activity_main.xml <?xml vers…

ovs-vswitchd的启动分析

ovs-vswitchd的启动分析&#xff08;无修改源码&#xff09; &#xff08;一&#xff09;主要数据结构和概念了解 1.概念 在 OVS 中, 有几个非常重要的概念&#xff1a; Bridge: Bridge 代表一个以太网交换机&#xff08;Switch&#xff09;&#xff0c;一个主机中可以创建一…

Metabase学习教程:提问-4

Metabase中的表连接 如何在简单和自定义问题中使用查询编辑器连接Metabase中的表。 当涉及到分析数据时&#xff0c;必须要使用连接是一个事实&#xff0c;在Metabase&#xff0c;我们试图使您的问题的答案尽可能简单&#xff0c;即使这需要一些更复杂的策略。在本文中&#…

Spring中拦截器重复注册的问题排查

注册器JpushInterceptor 功能&#xff1a;新版的Java推送服务&#xff0c;将部分请求转发到老版node 查看日志发现拦截器日志重复 同一个链路&#xff0c;发现&#xff0c;经过同一个拦截器两次 debug发现注册器重复注册 第一个通过registry.addInterceptor注册 是通过We…

组合数学总结

文章目录三、递推关系3.1 常系数线性递推关系特征根法1.齐次递推关系2.非齐次方程母函数方法三、递推关系 3.1 常系数线性递推关系 k阶齐次递推关系&#xff1a;anc1an−1c2an−2...ckan−k0&#xff0c;ck≠0(3.1.1)k阶非齐次递推关系&#xff1a;anc1an−1c2an−2...ckan−kf…

SpringCloud微服务(四)——Nacos服务注册和配置中心

SpringCloud Alibaba Nacos服务注册和配置中心 Spring Cloud Netflix Projects Entering Mainterance Mode SpringCloud Alibaba&#xff1a; 服务限流降级&#xff1a;默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 Rocke…

在 UltraEdit v15.00 及更高版本中添加用于语法高亮的 wordfile丨使用教程

UltraEdit原生支持开箱即用的最常用编程和标记语言的语法突出显示。但是&#xff0c;我们也有数百个其他语言的单词文件&#xff0c;而且很容易找到并添加您需要的语言&#xff01;重要提示&#xff1a;此电源提示适用于运行 UltraEdit v15.00或 UEStudio v09.10及更高版本的用…

rosjava零散

笔者之前想在非ros环境下使用通信&#xff0c;了解到rosjava可以实现&#xff0c;不过后来换成了rosbridge&#xff0c;也搜集了一些rosjava的资料&#xff0c;放在这里供参考(没时间整理了&#xff0c;格式较乱请见谅) 安装方式&#xff1a;sudo apt-get install ros-indigo-…

Blind Backdoors in Deep Learning Models 论文笔记

#论文笔记# 1. 论文信息 论文名称Blind Backdoors in Deep Learning Models作者Eugene Bagdasaryan Vitaly Shmatikov Cornell Tech出版社USENIX Security Symposium 2021 &#xff08;网安A类会议&#xff09;pdf论文主页 本地PDF代码pytoch_Backdoors_101 2. introduction …

《第一行代码》核心知识点:Android简介

前言 自本文开始&#xff0c;我将更新《第一行代码 Android 第2版.pdf》&#xff0c;&#xff08;提取码&#xff1a;n5ag &#xff09; 核心要点系列&#xff0c;通过阅读本系列文章可以帮助有Android基础的开发人员&#xff0c;去除冗余的基础讲解&#xff0c;直击核心知识点…

GEE开发之Modis_ET数据分析和获取

GEE开发之Modis_ET数据获取1 ET(蒸散量)2 MOD16A2(500米/8天)2.1 MOD16A2下的所有指数2.2 ET影像获取和查看3 ET日数据下载(以MOD16A2为例)4 ET月数据下载(以MOD16A2为例)5 ET年数据下载(以MOD16A2为例)前言&#xff1a;主要介绍Modis下的ET数据的获取和下载&#xff08;日数据…