当前位置: 首页 > 编程日记 > 正文

区块链 + 大数据:EOS存储

链客,专为开发者而生,有问必答!

此文章来自区块链技术社区,未经允许拒绝转载。
在这里插入图片描述
谈到区块链的存储,我们很容易联想到它的链式存储结构,然而区块链从比特币发展到今日当红的EOS,技术形态已经演化了10年之久。目前的EOS的存储除了确认结构的链式存储以外,在状态存储方面有了很大的进步,尤其是引入了MongoDB plugin以后,可以将功能有限的状态库搭上大数据的班车。本文将全面介绍EOS的存储技术。

EOS 存储,Merkle Tree,mongodb,chainbase,源码学习,context_free_actions

EOS的链式存储结构
EOS的区块数据结构如下:

field

explanation

timestamp

时间戳

producer

生产者

confirmed

生产者确认数

previous

链式结构前一个区块的id

transaction_mroot

交易默克尔树根

action_mroot

动作默克尔树根

schedule_version

生产者版本排序号

new_producers

下一个生产者

header_extensions

区块头扩展字段

producer_signature

区块签名,由生产者签名

transactions

块打包交易内容,是数组结构,可以多个

block_extensions

区块扩展字段

id

当前块id

block_num

当前块高度

ref_block_prefix

引用区块的区块头

Merkle Tree
默克尔树的演化路线是 Hash => Hash Tree => Merkle Tree ,他们都是为解决数据一致性而存在的,具体的含义如下:

Hash 是我们都熟知的技术了,它可以为一个文件或其他数据生成一个Hash值,我们在下载一个文件时,通常会在下载页面看到这个文件的Hash值以及该Hash值的算法,下载完毕以后,我们可以在本地对整个文件进行同样的Hash算法得到Hash值,然后与网页上的Hash值进行对比,如果相同,则说明文件完整,是网页上的源文件,如果不匹配则说明文件损坏,被修改或者不完整。
仍旧是文件完整性的校验需求,当这个文件特别大的时候,对这个文件进行Hash算法是能耗巨大的,所以可以将文件切割成很多的小块,每一个小块都有一个Hash,然后将所有小块的Hash值拼在一起再次进行Hash算法得到的就是Root Hash。这样一来,我们在下载大文件的时候,会先下载一个包含Root Hash的Hash list,通过校验Root Hash可以确定Hash list的正确性,确定Hash list正确以后,再逐个下载小块文件并逐一验证Hash,当发现某个小块Hash不匹配的时候,就可以单独重新下载该小块即可,而不必重新下载全部。Hash list的结构实际上是一个Root Hash 为根,小块Hashs为叶子节点的树高为2的Hash Tree。
Merkle Tree实际上是对Hash List的优化,它极大的提高了性能。它的结构是一个二叉树(也可以是多叉树,性能优化的关键点是它的高度是大于等于2的),每个节点最多只有两个子节点,只有叶节点是根据小块文件做的Hash,每两个相邻的叶节点的父节点是由这两个Hash做的父Hash,如果叶节点的总数是单数,则会剩余一个,逐级而上,最终会有一个的根节点,这个根节点就是Merkle Root。这样以来,我们在下载大文件的时候,会首先下载一个Merkle Tree,从最左下叶节点进行校验,逐级而上,将整个Merkle Tree校验完毕。这里面不同于上面Hash Tree的是,只要最左下相邻的两个叶节点的Hash值与他们的父节点的Hash通过了匹配,则可以立即开始下载这两个叶节点对应的文件块,并行地,再校验其他叶节点,这就提高了性能,不必校验完整的Merkle Tree之后再下载文件。
Merkle Tree 与 区块链
上面的区块数据结构中包含了两个与Merkle Tree相关的字段:

transaction_mroot,一个区块中的transactions字段可以包含多笔交易,区块中的transaction_mroot是所有该区块内打包的交易的Merkle Root,可以用来校验其中的每笔交易的正确性。如果该区块中不包含任何交易,则该字段的值为0000000000000000000000000000000000000000000000000000000000000000。节点同步数据的时候,会先将交易的Merkle Tree下载并通过Merkle Root来校验,而不是将所有的交易主体全部下载下来,这样可以节省轻节点的数据量。
action_mroot,创建一个基于所有分发的action的根,在区块内接收交易时进行评估。用在轻客户端的校验,功能同上。
action_mroot是始终有值的,哪怕transaction_mroot是0,这是因为出块本身也是一个action动作onblock,这个动作调用的是system合约的onblock函数。TODO:源码分析

/**

  • At the start of each block we notify the system contract with a transaction that passes in
  • the block header of the prior block (which is currently our head block)
    */
    signed_transaction get_on_block_transaction()
    {
    action on_block_act;
    on_block_act.account = config::system_account_name;
    on_block_act.name = N(onblock);
    on_block_act.authorization = vector<permission_level>{{config::system_account_name, config::active_name}};
    on_block_act.data = fc::raw::pack(self.head_block_header());

signed_transaction trx;
trx.actions.emplace_back(std::move(on_block_act));
trx.set_reference_block(self.head_block_id());
trx.expiration = self.pending_block_time() + fc::microseconds(999’999); // Round up to nearest second to avoid appearing expired
return trx;
}
context_free_actions
通过对eosio.null账户的nouce动作,可以将无签名的数据打包进入context_free_action字段,结果区块信息如下:

evsward@evsward-TM1701:~/work/src/github.com/eos/tutorials/bios-boot-tutorial$ cleos --wallet-url http://127.0.0.1:6666 --url http://127.0.0.1:8000 get block 440
{
“timestamp”: “2018-08-14T08:47:09.000”,
“producer”: “eosio”,
“confirmed”: 0,
“previous”: “000001b760e4a6610d122c5aa5d855aa49e29f3052ac3e40b9e1ef78e0f1fd02”,
“transaction_mroot”: “32cb43abd7863f162f4d8f3ab9026623ea99d3f8261d2c8b4d8bf920ab97e3d1”,
“action_mroot”: “09afeaf40d6988a14e9e92817d2ccf4023b280075c99f13782a6535ccc58cbb0”,
“schedule_version”: 0,
“new_producers”: null,
“header_extensions”: [],
“producer_signature”: “SIG_K1_K2eFDzbxCg3hmQzpzPuLYmiesrciPmTHdeNsQDyFgcHUMFeMC3PntXTqiup5VuNmyb7qmH18FBdMuNKsc7jgCm1TSPFbaj”,
“transactions”: [{
“status”: “executed”,
“cpu_usage_us”: 290,
“net_usage_words”: 16,
“trx”: {
“id”: “d74843749d1e255f13572b7a3b95af9ddd6df23d1d0ad19d88e1496091d4be2b”,
“signatures”: [
“SIG_K1_KVzwg3QRH6ZmempNsvAxpPQa42hF4tDpV5cqwqo7EY4oSU7NMrEFwG7gdSDCnUHHhmH1EwtVAmV1z9bqtTvvQNSXiSgaWG”
],
“compression”: “none”,
“packed_context_free_data”: “”,
“context_free_data”: [],
“packed_trx”: “8497725bb601973ea96f0000000100408c7a02ea3055000000000085269d000706686168616861010082c95865ea3055000000000000806b010082c95865ea305500000000a8ed3232080000000000d08cf200”,
“transaction”: {
“expiration”: “2018-08-14T08:49:08”,
“ref_block_num”: 438,
“ref_block_prefix”: 1873362583,
“max_net_usage_words”: 0,
“max_cpu_usage_ms”: 0,
“delay_sec”: 0,
“context_free_actions”: [{
“account”: “eosio.null”,
“name”: “nonce”,
“authorization”: [],
“data”: “06686168616861”
}
],
“actions”: [{
“account”: “eosiotesta1”,
“name”: “hi”,
“authorization”: [{
“actor”: “eosiotesta1”,
“permission”: “active”
}
],
“data”: {
“user”: “yeah”
},
“hex_data”: “0000000000d08cf2”
}
],
“transaction_extensions”: []
}
}
}
],
“block_extensions”: [],
“id”: “000001b8d299602b289a9194bd698476c5d39c5ad88235460908e9d43d04edc8”,
“block_num”: 440,
“ref_block_prefix”: 2492570152
}
正常的actions的内容是hi智能合约的调用,而context_free_action中包含了无签名的data数据,是已做数字摘要后的形态。源码中的操作:

// lets also push a context free action, the multi chain test will then also include a context free action
(“context_free_actions”, fc::variants({
fc::mutable_variant_object()
(“account”, name(config::null_account_name))
(“name”, “nonce”)
(“data”, fc::raw::pack(v))
})
);
EOS的StateDB
我们来设想一个场景:

A账户转账给B账户100个SYS,如何查看A账户的余额?

对于不知道以上动作何时发生的我们来讲,我们要如何做呢:

首先是从头扫描区块内的交易,交易内的action,直到找到A账户被创建的action所对应的区块号。
从这个区块号开始继续扫描,要将所有A账户的转账,包括收入和支出的所有action记录下来并统计。
算出A的当前余额。
以上步骤很容易出错且繁琐,每一次的余额查询都要重复这些操作实在是毫无意义,因此StateDB就诞生了,这个库顾名思义就是用来存储状态数据的,如果有了StateDB,上面的场景的解决办法就是:

从A账户被第一次收入SYS开始,为A账户在StateDB中建立一个table,存储A账户的余额,每当A账户发生转账的action,都会同步更新StateDB中相关table中A账户的余额的值,当我们需要知道A账户的余额时,我们可以直接查找这个余额state即可。
测试用例
这里为大家提供一个测试方法,也是我的命令history:

cleos create key
cleos wallet import 5JA9oDotJHoKnjUV6NrAMx4g5gWTCVCRLybTnG1XVU3EKGZZeNY
cleos wallet import --private-key 5JA9oDotJHoKnjUV6NrAMx4g5gWTCVCRLybTnG1XVU3EKGZZeNY
cleos wallet keys
cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
cleos wallet keys
cleos create account eosio usertesta1 EOS761KfjhYy3FSypZGG5hePrR8K2wzmw75JCDXgypKt2DLXZoZPW
cleos create account eosio eosio.token EOS761KfjhYy3FSypZGG5hePrR8K2wzmw75JCDXgypKt2DLXZoZPW
cleos set contract eosio.token work/src/github.com/eos/build/contracts/eosio.token/
cleos push action eosio.token create ‘[“eosio”,“100000000.0000 SYS”]’
cleos push action eosio.token issue
cleos push action eosio.token issue ‘[“usertesta1”,“10000000.0000 SYS”]’ -p eosio.token
cleos push action eosio.token issue ‘[“usertesta1”,“10000000.0000 SYS”]’ -p eosio
cleos get currency balance eosio.token usertesta1
cleos get table eosio.token usertesta1 accounts
cleos get table eosio.token eosio accounts
可以看到当我想获得usertesta1账户的余额时,是通过查询StateDB的table来获取的,而不是最开始的那种扫块的笨方法。

链式存储和StateDB存储的区别
链式存储,存储的是固定结构的数据:Block=> Block Header/ transactions=>actions,一个action的结构例子:
{
“account”: “eosiotesta1”,
“name”: “hi”,
“authorization”: [{
“actor”: “eosiotesta1”,
“permission”: “active”
}],
“data”: {
“user”: “yeah”
},
“hex_data”: “0000000000d08cf2”
}
这个例子中,我们调用了hello合约的hi函数,data传入的格式是hi函数中自定义的,所以在链式存储中,留给我们发挥的空间也即在此。

StateDB,存储的是一个最终要记录的状态,这个状态数据必须是有意义的,是有人关心的,无关紧要的数据请不要放在StateDB中去,所以StateDB是可以增删改查的,就像一个普通数据库那样,在合约中通过multi_index来操作,具体请参照文章EOS技术研究:合约与数据库交互
很多人搞不明白为什么区块链不可篡改,却在StateDB中好像可以修改还能删除?

其实不是这样的,链式存储的内容会将所有的动作action全部记录下来,是所有的过程数据,是流水帐,元数据,这些数据一旦上链是不可修改,不可删除的。而StateDB只是为了保存一个状态信息,这个状态信息的修改与删除并不影响区块链的不可篡改的特性。

目前StateDB的主流实现方式是将它放在内存中,而当有些人对StateDB的认识有偏差造成滥用的时候,会引发内存过载,因此一方面我们要非常清楚的理解StateDB的含义,一方面EOSIO帮助我们提供了一个mongodb-plugin插件来同步StateDB数据。

mongodb
安装
下载tgz安装包
解压安装到/usr/local/bin(或者其他某路径)
sudo mkdir /data/db
普通模式
sudo mongod
mongo
服务模式
我们也可以使用ubuntu系统的服务模式。

曾经我们要定义一个系统启动时自启动服务的方式是在/etc/init.d 目录下写一个脚本来执行,现在在ubuntu的服务模式下,我们可以丢弃那种方式,服务模式的命令是service,而现在的ubuntu系统推崇使用的systemctl命令,他俩的使用方法的区别就在于参数的顺序。

定义一个配置文件mongod.conf
定义一个服务文件,放置在/etc/systemd/system/
sudo vi /etc/systemd/system/mongodb.service

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target

[Service]
User=mongodb
ExecStart=[‘mongod’ command location] --quiet --config /etc/mongod.conf

[Install]
WantedBy=multi-user.target
查找服务状态
systemctl list-unit-files

查询mongodb服务的激活状态
systemctl is-enabled mongodb

激活系统自启动服务
sudo systemctl enable mongodb

启动mongodb服务
sudo systemctl start mongodb

查询mongodb服务状态
sudo systemctl status mongodb

停止mongodb服务
sudo systemctl stop mongodb

调试模式
IDE选择CLion,EOS源码下载最新的,保证本地可以使用脚本编译通过,安装了相关依赖包,然后在CLion中导入EOS,CLion会自动识别CMakeList.txt文件生成makefile文件并make编译执行。编译时可能会遇到错误,一般来讲要么是环境依赖没有配置好,要么就是CMakeList.txt要有修改,例如mongodb-plugin导入时要在总开关配置上开启。

set(BUILD_MONGO_DB_PLUGIN “true”)
全部编译成功以后,会自动识别出可以debug的target,与EOS中配备CMakeList.txt的模块一一对应。

安装Mongo Explorer插件
上面我们介绍了MongoDB的安装方法,以及启动nodeos时的配置方法(除了上文提到的总开关,当然要在config.ini文件末尾设置上plugin = eosio::mongo_db_plugin,这部分内容演练多次,这里不再赘述。)链启动开始出块以后,会同步到mongodb中去(注意要预先启动mongod守护进程,可以理解为服务端),通过mongo命令接入可使用mongo命令查询数据,但这样很不方便。可以在CLion中安装mongo-plugin,配置好效果如下:

在这里插入图片描述

相关文章:

全网最全的Windows下Anaconda2 / Anaconda3里Python语言实现定时发送微信消息给好友或群里(图文详解)...

不多说&#xff0c;直接上干货&#xff01; 缘由&#xff1a; &#xff08;1&#xff09;最近看到情侣零点送祝福&#xff0c;感觉还是很浪漫的事情&#xff0c;相信有很多人熬夜为了给爱的人送上零点祝福&#xff0c;但是有时等着等着就睡着了或者时间并不是卡的那么准就有点强…

Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo

更新了xcode后使用goland运行项目时提示 Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo 更具提示打开xcode 点击agree安装即可&#xff01; 转载于:https://www.cnblogs.com/mafeng/p/6196494.html

arc diff 指定版本号_Phabricator客户端安装

前提需要配置好服务器端客户端安装mac环境下&#xff0c;指定一个目录$ mkdir somewhere/$ cd somewhere/somewhere/ $ git clone https://github.com/phacility/libphutil.gitsomewhere/ $ git clone https://github.com/phacility/arcanist.git配置环境变量&#xff0c;在.ba…

EOSIO 转帐详解

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 EOS和EOS的不同之处 在EOS网络中存在两种货币&#xff0c;一种是EOS&#xff0c;还有一种是EOS网络中的代币。说到这里大家似乎有点疑惑&#xff0…

各种函数调用约定及浮点数传参

32位下_stdcall, _fastcall, _cdecl #include <windows.h>int _stdcall Func1(int a, int b, int c, int d) {return abcd; } int _fastcall Func2(int a, int b, int c, int d) {return abcd; } int _cdecl Func3(int a, int b, int c, int d) {return a b c d; }…

cookie、session总结

前几天在调试第三方支付接口时碰到一个session失效问题&#xff0c;用了几天时间才搞明白&#xff0c;现在回想一下&#xff0c;主要还是由于cookie和session这一块的一些基本概念没有搞清楚&#xff0c;现总结一下。 浏览器使用HTTP协议作为应用层协议&#xff0c;而HTTP协议是…

glibc降级后怎么恢复 linux_Linux(CentOS)GLIBC出错补救方式

出于各种原因&#xff0c;我玩坏了我的系统.........主要出错原因是更改 /usr/lib64 下的 libc.so.6 等文件引起&#xff0c;具体错误及补救方式附上&#xff0c;希望可以帮到心里失火后来人&#xff1a;首先&#xff0c;不要随便重新启动&#xff01;&#xff01;&#xff01;…

将Eclipse代码导入到AndroidStudio的两种方式

实现步骤 1. 从Eclipse中导出Gradle build files 在Eclipse菜单中 File --> Export-->Generate Gradle build files接下来会到达警告界面&#xff0c;这里会提示AndroidStudio可以直接导入ADT的工程&#xff0c;先过&#xff0c;后面有直接导入的讲解。选中你的项目工程&…

微软浏览器适配问题前端_「图」微软新贡献:修复Chromium浏览器的奇怪触控板手势问题...

去年微软宣布计划成为Chromium项目的重要贡献者之一&#xff0c;希望为包括Edge和Chrome在内所有基于Chromium的浏览器带来更多改进和功能。在增强鼠标滚动和搜索功能之外&#xff0c;微软现在将部分精力放在部分Windows 10设备(例如Surface Pro系列和Surface Book系列)上奇怪的…

ruby gems列表

1 https://github.com/shageman/cobradeps 转载于:https://www.cnblogs.com/or2-/p/9268352.html

简明区块链原理

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 “区块链”应有特质&#xff1a; 使用了具有 “哈希链” (下文有解释) 形式的数据结构保存基础数据 有多个结点参与系统运行&#xff08;分布式…

Bash shell

一、认识bash shell 1、登录取得的shell就记录在/etc/passwd这个文件内 可以使用cat /etc/passwd查看 2、bash shell 功能 a. 命令记忆能力&#xff08;history&#xff09;&#xff0c;默认1000个&#xff0c;存在~/.bash_history文件 b. 命令与文件补全功能&#xff08;Tab键…

快过高铁!构建云分布式应用还能这样操作?!

先跟跟大家说一个中国历史上杰出的军事家、政治家&#xff0c;长长的胡子&#xff0c;红的发黑的脸&#xff0c;骑着一匹红色的马。没错&#xff01;他就是三国跑的最快的男人——曹操&#xff08;说曹操曹操到&#xff09;&#xff01; 不说笑了。 关羽&#xff0c;字云长&…

基于安卓的考试系统_基于安卓11定制!华为最新手机系统曝光:体验堪比苹果iOS!...

在最近的一场发布会上&#xff0c;华为正式宣布了自家的HMS和AppGallery服务&#xff0c;对标安卓Play商店和苹果Appstore商店&#xff0c;这一举措让华为再度登上风口浪尖。这种做法在业界人士眼里的目的只有一个&#xff0c;华为要脱离安卓系统自立门户&#xff0c;从建立第三…

区块链前世今生

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 比特币的起源 2008年&#xff0c;一位化名为中本聪的人&#xff0c;在一篇为《比特币&#xff1a;一个点对点的电子现金系统》的论文中首先提出了比…

前端知识之HTML内容

参考:http://www.cnblogs.com/liwenzhou/p/7988087.html HTML介绍 Web服务本质 import socketsk socket.socket()sk.bind(("127.0.0.1", 8080)) sk.listen(5)while True:conn, addr sk.accept()data conn.recv(8096)conn.send(b"HTTP/1.1 200 OK\r\n\r\n&qu…

征途linux mysql_MySql征途之mysql常用命令

mysql征程之mysql常用命令一、连接MySql语法&#xff1a; mysql -h 主机地址 -u 用户名 &#xff0d;p 用户密码例1&#xff1a;连接到本机上的MYSQL。键入命令mysql -u root -p(本地连接 主机地址可以不写)&#xff0c;回车后提示你输入密码&#xff0c;输入正确之后&#xff…

区块链+物联网=?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链与物联网(IoT)的交叉应用已成为最有前途的区块链用例之一。在过去的几个月里&#xff0c;IoTeX一直与我们的战略合作伙伴合作&#xff0c;并…

mysql 中文截取_mysql 截取中文字符

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

2016年度工作总结

一想起来今天全办公室人都在写年终总结的场景&#xff0c;不由自主的笑开了颜&#xff0c;因为我把一名程序媛的年终总结硬生生的写成了一篇“散文”&#xff0c;而且还是很“冒牌”的总结&#xff0c;以下就是“散文版”的总结。 在紧锣密鼓的业务GO推广上线期间&#xff0c;x…

django-后台sms管理系统的css框架

django-后台sms管理系统的css框架 地址&#xff1a;https://adminlte.io/ 下载代码。使用index.html的页面及相关文件 通过下在线检查adminlte.io的后台的各种模块元素&#xff0c;仿写。posted on 2018-07-06 11:41 .Tang 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.c…

go语言学习-iota

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 Go没有枚举类型,可以用常量模拟可以用iota生成从0 开始的自动增长的枚举值。按行递增,可以省略后续行的 iota 关键字. iota 在一个const()中每次累…

mysql中查询表格属性

&#xff08;1&#xff09;获取数据库表格列设置的长度&#xff0c;SQL SELECT CHARACTER_MAXIMUM_LENGTH FROM information_schema.COLUMNS WHERE TABLE_NAME表名 AND TABLE_SCHEMA数据库名 AND COLUMN_NAME字段名 &#xff08;1&#xff09;查出数据库表格所有的属性 SELECT …

BZOJ 2190: [SDOI2008]仪仗队

2190: [SDOI2008]仪仗队 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2689 Solved: 1713[Submit][Status][Discuss]Description 作为体育委员&#xff0c;C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵&#xff0c;为了保证队伍在行进中整齐划一&…

mysql下载解压安装_mysql zip 解压安装

系统&#xff1a;win10 专业版mysql 5.7.21 解压安装。对于Windows&#xff0c;mysql官网推荐使用可执行文件进行安装&#xff0c;这里我还是暂时用noinstall 解压zip文件来安装从zip压缩包安装mysql的过程如下&#xff1a;1. 解压文档到指定目录2. 创建选项文件如果您在运行服…

go 性能相关总结

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 性能测试基本概念 基本概念 Benchmark: 性能测试 ns/op: 纳秒/每个操作&#xff0c;前面数值越小越快 命令 go test -c go test -test.bench. -t…

64位 ubuntu android studio gradle 权限不够 缺少文件和权限导致

安装 32位 库文件 sudo apt-get install lib32z1 给文件夹加权限 chmod 777 -R SDK chmod 777 -R android-studio -R表示所有子文件和文件夹 模拟器需要下载 gcc3-libs.tar.bz2 把文件解压移动到 /lib 即可转载于:https://www.cnblogs.com/exayong/p/6216077.html

微信是个坑货4-网页授权

功能&#xff1a;认证服务号通过网页授权获取用户信息 --公众号后台配置 》此次设置的是网页授权域名,设置成你调试的域名或者正式备案的域名&#xff08;不带http或https&#xff09;。 --自定义菜单设置 设置参数&#xff1a; appid&#xff1a;微信公众号的appid uri&#x…

root 123 mysql_MySQL常用命令

1、查看数据库状态 及启动停止/etc/init.d/mysqld status/etc/init.d/mysqld start/etc/init.d/mysqld stop2、给用户配置初始密码123456&#xff1a;mysqladmin -u root -password 1234563、修改root用户密码为 abc123mysqladmin -u root -p123456 password abc1234、如果想去…

想挖矿?不如先学习一下以太坊

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 许多使用点对点协议且基于区块链的项目在性能和吞吐量上夸大其辞。在研发阶段&#xff0c;这些项目已经出现了一些创新&#xff0c;但是一旦这些协…