狠狠操夜夜甜|人妻在线中文字幕亚洲无码不卡av|一区二区欧美亚洲|日躁夜躁狠狠躁2001|亚洲,超碰,欧美|18AV成人电影|午夜成人免费在线|婷婷激情网深爱五月|色欲综合成人在线|在线美女搞黄大片

中企動力 > 頭條 > 網(wǎng)上云筆記

網(wǎng)站性能檢測評分

注:本網(wǎng)站頁面html檢測工具掃描網(wǎng)站中存在的基本問題,僅供參考。

網(wǎng)上云筆記

教授玩幣:區(qū)塊鏈(DApp)微信小程序云筆記實戰(zhàn)項目開發(fā)案例! 小程序視頻課程

img

踏羈旅

關注

1. 項目功能概述

微信小程序云筆記的主要功能是可以撰寫、編輯、查詢筆記,不過與傳統(tǒng)的云筆記不同的是,用于保存云筆記的不是傳統(tǒng)的關系型數(shù)據(jù)庫(如 MySQL),而是基于區(qū)塊鏈技術的以太坊網(wǎng)絡。

也就是說,云筆記會將筆記的內容利用 Web3.js API 保存到以太坊網(wǎng)絡上,永久存儲,不可刪除。不過由于云筆記的特殊性,需要允許修改云筆記的內容。

2. 編寫和測試云筆記智能合約

由于云筆記需要將筆記內容保存到以太坊網(wǎng)絡中,所以需要編寫一個合約。通過合約中的函數(shù)保存筆記的內容,以及修改和搜索筆記內容。

云筆記合約的基本思想就是將云筆記的內容保存到合約中的映射(mapping)變量(data)中,由于合約的成員變量在默認情況下是以store形式存儲的,所以映射中的所有數(shù)據(jù)都會永久存儲在區(qū)塊鏈上。

下面的代碼編寫了用于服務云筆記的名為 CloudNoteService 的智能合約。在該合約中通過 addNote 函數(shù)添加筆記,通過 updateNote 函數(shù)更新筆記,通過 getNote 函數(shù)獲取筆記內容。

2.1直接上代碼

// CloudNoteService.solpragma 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函數(shù)將string類型的值轉換為bytes32類型的值 // 在進行比較 require(keccak256(id) != keccak256(""), "id不能為空 "); // 筆記標題不能為空 require(keccak256(name) != keccak256(""), "name不能為空 "); // 筆記內容不能為空 require(keccak256(content) != keccak256(""), "content不能為空 "); // 同一個賬戶下,云筆記名稱不能相同 require(keccak256(data[id][name]) == keccak256(""), "note已經(jīng)存在!"); // 將筆記內容添加到到data變量中 data[id][name] = content; } // 更新云筆記的內容,參數(shù)與addNote函數(shù)的參數(shù)相同 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; } // 根據(jù)用戶ID和云筆記名稱獲取云筆記內容。如果沒有該云筆記,返回空串 function getNote(string id, string name) view public returns(string) { return data[id][name]; }}

3. 將 CloudNoteService 合約部署到以太坊網(wǎng)絡上

將 CloudNoteService 合約部署到以太坊網(wǎng)絡上 在這一節(jié)會將CloudNoteService 合約部署到以太坊網(wǎng)絡上。首先使用 Chrome 瀏覽器的 MetaMask 插件登錄賬戶(需要輸入創(chuàng)建賬戶時指定的賬戶密碼),如果在以太坊主網(wǎng)上有足夠的以太幣,可以選擇以太坊主網(wǎng)。

不過對于大多數(shù)開發(fā)者來說,并沒有以太幣,所以只能選擇 Ropsten 測試網(wǎng)絡,并免費申請若干個以太幣。

用 MetaMask 插件登錄以太坊賬戶后,在 Remix 環(huán)境的 Environment 列表選擇 Injected Web3,然后單擊 Deploy 按鈕發(fā)布 CloudNoteService 合約。這時會彈出如下圖所示的 MetaMask Notification 頁面,單擊 SUBMIT 按鈕會提交用于部署 CloudNoteService 合約的交易。

提交交易后,如果交易成功被處理,在Remix環(huán)境會顯示如下圖所示的效果。

4. 編寫與合約交互的Database類

在編寫代碼之前需要先安裝兩個模塊:ethereumjs-tx 和 eb3-eth-abi。

首先安裝 cnpm,速度更快。

npm install -g cnpm --registry=https://registry.npm.taobao.org

安裝完 cnpm 后,可以直接使用如下的命令安裝 ethereumjs-tx 模塊和 web3-eth-abi 模塊。

cnpm install --save ethereumjs-txcnpm install --save web3-eth-abi

如果中間安裝出錯,或用 require 導入相關模塊出錯,可以刪除工程目錄中的 node_modules 子目錄,然后在工程目錄中執(zhí)行如下的命令重新安裝所有相關模塊。

npm install

為了方便,本例會將所有通過 web3.js api 訪問合約的代碼都封裝在 Database 類中。該類的代碼如下:

// 導入web3模塊var Web3 = require('web3');// 導入fs模塊var fs = require('fs');// 導入ethereumjs-tx模塊var Tx = require('ethereumjs-tx');// 導入web3-eth-abi模塊var ethabi = require('web3-eth-abi');class Database{ // 在構造方法中完成初始化工作 constructor() { // 指定CloudNoteService合約的部署地址,就是在11.3.2節(jié)將CloudNoteService合約部署在 // 以太坊網(wǎng)絡上的地址。 this.contractAddress = '0xb40e094c4dc203527044c4e6f8d0717314fac9a9'; // 指定gasPrice,這里使用1 GWei,十六進制表示就是0x3B9ACA00。1 GWei是大多數(shù)礦工 // 可以接收的價格 this.gasPrice = '0x3B9ACA00'; // 創(chuàng)建Web3對象,HttpProvider類構造方法的參數(shù)值一定要指定為infura.io節(jié)點ropsten // 測試節(jié)點的Url this.web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/oOYCD7wiWl5A2e65OaEZ")); // 讀取abi文件的內容,并轉化為JSON對象 this.abi = JSON.parse(fs.readFileSync("./CloudNoteService_sol_CloudNoteService.abi").toString()); // 創(chuàng)建與CloudNoteService合約綁定的contract實例 this.contract = this.web3.eth.contract(this.abi).at(this.contractAddress); } // 獲取當前賬戶已經(jīng)發(fā)布的交易數(shù) getNonce() { // getTransactionCount函數(shù)參數(shù)值就是用于調用CloudNoteService合約函數(shù)的以太坊賬戶 var nonce = this.web3.eth.getTransactionCount("0x8eaef74d82df04ca86d5bbdddc8c63ea9f6680de") return nonce; } // 添加或更新筆記,id:用戶ID,name:筆記名稱,content:筆記內容 // notefun:描述CloudNoteService合約中函數(shù)的十六進制數(shù)據(jù) addUpdateNote(id, name, content, notefun) { // 預估調用notefun表示的函數(shù)大概需要多少gas var estimateGas = this.web3.eth.estimateGas({ to: this.contractAddress, data: notefun }); // 將gas預估值轉換為十六進制格式 estimateGas = this.web3.toHex(estimateGas); // 獲取當前交易的nonce值 var nonce = global.getNextNonce(); // 定義交易對象 var rawTx = { nonce: nonce, // nonce值,每筆交易加1 gasPrice: this.gasPrice, // gas單價 gasLimit: estimateGas, // 完成交易需要多少gas(預估值) to: this.contractAddress, // 合約地址 value: '0x00', // 這里設為0x00 data: notefun // 如果是調用合約函數(shù),需要指定表示合約函數(shù)的十六進制數(shù)據(jù) } // 創(chuàng)建Tx對象風險rawTx對象 var tx = new Tx(rawTx); // 設置賬戶的私鑰 const privateKey = new Buffer('accc693934afc24c5c6c105030a32d1408b1df02b1ab8bd54283ba0b586be2c9', 'hex'); // 用賬戶的私鑰對rawTx中的數(shù)據(jù)簽名 tx.sign(privateKey); // 將簽名結果序列化 var serializedTx = tx.serialize(); // 發(fā)送經(jīng)過簽名后的交易數(shù)據(jù) return this.web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex')); } // 添加筆記 addNote(id, name, content) { // 獲取描述CloudNoteService合約中addNote函數(shù)的十六進制數(shù)據(jù) var addNote = this.contract.addNote.getData(id, name, content); // 調用addUpdateNote方法添加筆記 return this.addUpdateNote(id,name,content,addNote); } // 更新筆記 updateNote(id,name,content) { // 獲取描述CloudNoteService合約中updateNote函數(shù)的十六進制數(shù)據(jù) var updateNote = this.contract.updateNote.getData(id, name, content); // 調用addUpdateNote方法更新筆記 return this.addUpdateNote(id,name,content,updateNote); }d // 根據(jù)用戶ID和筆記名稱獲取筆記內容 getNote(id,name) { // 獲取描述CloudNoteService合約中getNote函數(shù)的十六進制數(shù)據(jù) var getNote = this.contract.getNote.getData(id,name); // 通過web3.eth.call函數(shù)調用CloudNoteService合約中的getNote函數(shù) // 在調用過程中不需要對數(shù)據(jù)進行簽名 var result = this.web3.eth.call({ to: this.contractAddress, data: getNote }); // 使用ethabi.decodeParameter函數(shù)對getNode函數(shù)返回結果解碼 return ethabi.decodeParameter('string',result); } // 返回交易狀態(tài),1:成功, 0:失敗 null:未處理 queryTransactionStatus(hash) { // 獲取hash指定的交易數(shù)據(jù) var result = this.web3.eth.getTransactionReceipt(hash); if(result != null) { return parseInt(result.status,16); } return null; }}// 導出Database類,否則其他JavaScript文件無法使用Database類module.exports = Database;

在 Database 類的構造方法中創(chuàng)建 Web3 對象時需要為 Web3 類的構造方法指定一個 HttpProvider 對象作為參數(shù),而 HttpProvider 類的構造方法需要一個以太坊節(jié)點的地址。以太坊節(jié)點可以自己搭建,不過比較滿足。如果不想自己搭建以太坊節(jié)點,可以使用現(xiàn)成的以太坊節(jié)點,如本例使用的 infura.io。這是一個已經(jīng)搭建好的以太坊節(jié)點,可以通過這個節(jié)點連接以太坊主網(wǎng),以及 Ropsten 測試網(wǎng)絡。 通過 infura.io 節(jié)點連接以太坊網(wǎng)絡,需要一個 Url。首先進入下面的頁面:

https://infura.io

然后滑動到頁面的最下端,單擊 GET STARTED FOR FREE 按鈕,會進入如下圖所示的頁面。輸入 First 和 Last 以及 Email,并單擊 Submit 上面的按鈕證明自己不是機器人(robot)后,單擊 Submit 按鈕提交錄入的信息。infura.io 會給你輸入的郵箱中發(fā)一封 Email。

這封 Email 會包含所有節(jié)點的 Url,包括以太坊主網(wǎng)的 Url 和 Ropsten 測試網(wǎng)絡的 Url。如本例使用的 https://ropsten.infura.io/oOYCD7wiWl5A2e65OaEZ 就是 Ropsten 測試網(wǎng)絡的 Url。

在 addUpdateNote 方法中使用了 global.getNextNonce 函數(shù)獲取當前交易的 nonce 值。global 是 Node.js 的全局變量。在任何 JavaScript 文件中都可以直接使用 global 變量。通常將全局使用的資源(如變量、函數(shù)等)保存到 global 變量中,以便在任何地方都可以使用。在 CloudNoteService 工程根目錄中有一個 app.js 文件,這是基于 Express 框架的 Web 應用的入口腳本文件。在該文件中使用 require 函數(shù)引用了 database 模塊,并調用 Database 類的 getNonce 方法獲取指定賬號發(fā)布的交易數(shù)量,然后將一個獲取當前交易 nonce 值的匿名函數(shù)賦給 global.getNextNonce 變量,實現(xiàn)代碼如下:

var Database = require('./routes/database')database = new Database();global.database = database;var nonce = database.getNonce();// 由于每次調用getNextNonce函數(shù)都要將global.nonce加1,所以這里需要減1// 因為nonce值從0開始global.nonce = --nonce; global.getNextNonce = function(){ global.nonce++; // 將nonce值轉換為十六進制形式 return '0x' + global.nonce.toString(16);}

5. 為服務添加 MySQL 數(shù)據(jù)庫支持

可能有很多朋友會感到奇怪,云筆記項目不是將數(shù)據(jù)保存到以太坊網(wǎng)絡中了嗎?怎么還需要集中式存儲。這是因為以太坊網(wǎng)絡的訪問速度不算快,為了提高訪問效率,將云筆記 name 列表保存到了 MySQL 數(shù)據(jù)庫中,當然,大家也可以將所有的數(shù)據(jù)都保存到以太坊網(wǎng)絡中。云筆記項目只是用來演示如何將 MySQL 數(shù)據(jù)庫和以太坊結合在一起使用。

本例需要建立一個名為 cloudnote 的 MySQL 數(shù)據(jù)庫,在數(shù)據(jù)庫中只有一個名為 note 的表,用于保存小程序當前登錄賬戶(user_id 字段)、云筆記的名字(name 字段)和最后一次與該條云筆記相關的交易地址(code 字段)。note 表的結構如下圖所示。

本例涉及到的與 note 表相關的操作包括向 note 表添加記錄,更新 note 表中的記錄,獲取某一用戶所有的云筆記列表。

在 routes 目錄創(chuàng)建一個 mysql_connect.js 文件,并在該文件中編寫了一個名為 Database 的類,用于完成與 note 表相關的工作。

// mysql_connect.js// 導入mysql模塊var mysql=require('mysql');class Database{ constructor() { // 連接mysql數(shù)據(jù)庫 this.connection=mysql.createConnection({ host: '127.0.0.1', user: "root", //數(shù)據(jù)庫用戶名 password: "12345678", //數(shù)據(jù)庫密碼 database: "cloudnote", //數(shù)據(jù)庫 port: 3306, charset: "UTF8_GENERAL_CI", timezone:"local", multipleStatements:false }); } // 向note表添加記錄,req和res用于獲取用戶請求和用戶響應,這兩個參數(shù)會從相應的路由函數(shù)傳入 // 路由函數(shù)會在下一節(jié)實現(xiàn) addNote(req,res){ // 通過insert into語句將數(shù)據(jù)插入note表中 this.connection.query("insert into note set ?",{user_id:req.query.id,name:req.query.name,code:req.query.code},function (err, result) { if (err) { console.log(err); } else { console.log(result) // 如果成功插入...

開源云筆記程序Standard Notes 企業(yè)視頻課程

img

祁祥

關注

StandardNotes是一款跨平臺的開源云筆記應用,支持的平臺包括:Linux,MacOS,Windows,Android,iOS。在任何設備上添加,編輯和閱讀筆記,同步功能啟用端到端加密保證數(shù)據(jù)安全,多種編輯模式(Markdown、富文本、代碼編輯、Github、VIM…),可選擇自動備份加密數(shù)據(jù)到Dropbox、OneDrive和谷歌驅動器,支持恢復到以前的版本。StandardNotes自建云服務,高級用戶收費,有能力的用戶可使用開源的代碼自助建立在自建的服務器上。

開源派紅包福利

【人人可領,天天可領,搶領大紅包!】#吱口令#長按復制此消息,打開支付寶就能領??!GptxsZ439Q

每日佳軟——您的私人云筆記 互聯(lián)網(wǎng)視頻課程

img

Delicia

關注

今天為大家推薦一款安卓筆記軟件——易碼。易碼是一款簡潔且實用的筆記軟件,軟件不含廣告且完全免費,更重要的是,易碼除了使用時不會在你的手機上做任何多余的事情。不管是文藝青年靈感突發(fā)像寫點東西,還是日常使用需要隨手記錄信息,易碼都能滿足你的需求。

與傳統(tǒng)筆記軟件不同的管理方式

跟傳統(tǒng)的文件夾管理方式不一樣,易碼采用的是以“庫”為單位來管理,類似于標簽,你可以在本地或各種云盤上創(chuàng)建你的筆記庫,讓你免除了在手機上翻一層又一層文件夾的煩惱,更易于管理你的筆記

有安全保障的筆記軟件

現(xiàn)在很多的手機用戶,特別是上了年紀的用戶,為了防止自己把重要的信息忘記,都會把它記在手機上,如各個支付軟件的支付密碼、各種賬號的登陸密碼等,這時,對筆記軟件的安全性就要有很嚴格的要求。易碼是一款私人云筆記軟件,你可以為自己的筆記設置密碼,這樣即使是手機丟了也不怕重要信息的丟失。

簡潔而又實用的編輯功能

跟別的同類型軟件不一樣,易碼的文本編輯界面沒有各種各式功能按鈕,但依舊支持多種文本編輯功能。易碼除了支持Markdown實時預覽、Markdown快捷鍵等功能以外,還能自定義字體,調整字體的樣式。在主頁面還可以將多條筆記合并,省去多次復制粘貼的麻煩。值得一提的是,易碼還支持編輯保護,不用擔心手機沒電、系統(tǒng)崩潰的各種以外情況的出現(xiàn),盡力保障編輯中的筆記內容不丟失。

Pixel研習社每天都會為大家推薦一到兩款的安卓佳軟,推薦范圍為一些純凈的、小眾而又廣受好評的軟件,喜歡的可以訂閱我們。

img

在線咨詢

建站在線咨詢

img

微信咨詢

掃一掃添加
動力姐姐微信

img
img

TOP