存档在 2018年11月

怎样编译安装Geth

2018年11月30日

【介绍】

go-ethereum 是以太坊常用的客户端,简称 Geth 。

官网:https://geth.ethereum.org/
下载:https://geth.ethereum.org/downloads/

【依赖】

安装Git, Nodejs, gcc-c++, ntp, epel 等辅助工具:

yum install git bzip2 gcc-c++ ntp epel-release nodejs

安装cmake:

参考:http://amon.org/cmake

安装golang(go-ethereum是golang编写的):

参考:http://amon.org/go

【安装】

git clone https://github.com/ethereum/go-ethereum.git  
cd go-ethereum/
make all
echo "export PATH=$PATH:/root/go-ethereum/build/bin" >> /etc/profile
source /etc/profile

报错:

...
github.com/ethereum/go-ethereum/swarm/testutil
util.go:45: exit status 2
exit status 1
make: *** [all] Error 1

参考:https://github.com/ethereum/go-ethereum/issues/15533
参考:https://blog.csdn.net/bravezhe/article/details/81838430
参考:https://bitshuo.com/topic/592503e7e358dd8c2f65d859

mv /usr/local/include/iconv.h /usr/local/include/iconv.h.back

启动网络时间同步,开启防火墙,打开8087和30303端口(geth用到的端口):

systemctl enable ntpd 
systemctl start ntpd
systemctl start firewalld
firewall-cmd --zone=public --add-port=8087/tcp --permanent
firewall-cmd --zone=public --add-port=30303/tcp --permanent

【命令】

语法:

geth [options] command [command options] [arguments...]

帮助:

geth --help

【配置】

搭建私有链前需要创建 genesis.json 配置文件用于初始化创世区块:

参考:https://bitshuo.com/topic/59a531a0acad6ff75e6297af
参考:http://wp.iter-cc.com/?p=1055
参考:http://bigdatadecode.club/Ethereum-private-chain.html

{
  "config": {
        "chainId": 8,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {"0x0be5196a5503e4051b21e713f245b3ab24bcfeaf": {"balance":"2000000000000000000000000"}},
  "coinbase"   : "0x0be5196a5503e4051b21e713f245b3ab24bcfeaf",
  "difficulty" : "0x20000",
  "extraData"  : "0x74686520726f73657320696e206865722068616e642c2074686520666c61766f7220696e206d696e65",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x00000000c000ff59",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x599DA33A"
}

配置说明:
config.chainId // 区块链的ID,在 geth 命令中的 –networkid 参数需要与 chainId 的值一致
config.homesteadBlock // Homestead 硬分叉区块高度,不需要关注
config.eip155Block // EIP 155 硬分叉高度,不需要关注
config.eip158Block // EIP 158 硬分叉高度,不需要关注
coinbase // 矿工账号,第一个区块挖出后将给这个矿工账号发送奖励的以太币
difficulty // 难度值,越大越难
extraData // 附加信息随便填
gasLimit // gas 的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大
nonce // 一个 64 位随机数
mixhash // 与 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash
parentHash // 上一个区块的 hash 值
alloc // 预设账号以及账号的以太币数量,私有链挖矿比较容易可以不配置

创建区块文件夹,使用 geth 的 init 命令初始化创世区块:

mkdir -p /root/ethbase/chain
cd root
geth --datadir "/root/ethbase/chain" init genesis.json

输出:

INFO [11-30|22:42:41.552] Successfully wrote genesis state         database=lightchaindata                          hash=1e7bea…deffa5

输出调试log:

geth --dev console 2>> geth_dev_log

输出:

Welcome to the Geth JavaScript console!

instance: Geth/v1.8.20-unstable-ef8ced41/linux-amd64/go1.11.2
coinbase: 0xf13ddcac8c11027fac5305882ec4c3236c20b265
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)
 datadir:
 modules: admin:1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0

然后在大于号后输入尝试:

    > eth.accounts
    "0x3341e796e5d43919287d49a86cb595d74ddea657"

即完成Geth的安装。

【同步】

参考:https://www.jianshu.com/p/3445ff08229a
参考:https://blog.csdn.net/guokaikevin/article/details/79254785

Ethereum(以太坊)经过历年的累积,交易区块大小已有几百G左右。如果全部同步,并且严格逐个验证,需要太多的时间和计算。

「同步」的意思是把网络上的区块全部下载到本地,以同步到网络的最新状态。使用客户端前必须先同步区块。

以太坊有三种同步的模式:full 、 fast 和 light。

full 模式:

从开始到结束,获取区块的header,获取区块的body,从创始块开始校验每一个元素,需要下载所有区块数据信息。速度最慢,但是能获取到所有的历史数据。

geth --syncmode full

fast 模式:

快速同步模式,只下载状态(state downloads)。获取区块的header,获取区块的body,在同步到当前块之前不处理任何事务。然后获得一个快照,此后,像full节点一样进行后面的同步操作。

这种方法用得最多,目的在不要在意历史数据,将历史数据按照快照的方式,不逐一验证,沿着区块下载最近数据库中的交易,有可能丢失历史数据。此方法可能会对历史数据有部分丢失,但是不影响今后的使用。

使用此模式时注意需要设置 –cache,默认16M,建议设置为 1G(1024)到 2G(2048)。

geth --fast --cache 512

light 模式< :/strong>

仅获取当前状态。验证元素需要向full节点发起相应的请求。

geth --light

更优雅的同步方式

同步时把输出日志重定向到network_sync.log中,并进入控制台。这样就可以边同步边使用控制台命令。

geth --fast console 2>network_sync.log

浏览日志:

tail -f network_sync.log

【账户】

参考:https://www.jianshu.com/p/3445ff08229a

新建账户:

geth account new
> personal.newAccount("passphrase")

非交互方式:

geth --password <passwordfile> account new

密码以明文方式写在文件 passwordfile 里

导入账户:

geth account import <keyfile>

私钥以明文方式写在文件 keyfile 里,每个一行。

是存着账户信息的 json 文件,其中私钥是被账号密码(password)加密后,存放在里面的。

不同平台的 keyfile 默认存储位置是不同的
1. Windows: C:\Users\username%appdata%\Roaming\Ethereum\keystore
2. Linux: ~/.ethereum/keystore
3. Mac: ~/Library/Ethereum/keystore

结合 –password,可以使用在导入账户时设置密码:

geth --password <passwordfile> account import <keyfile>

修改密码:

geth account update <address>

例如 geth account update 2:2是账户的编号,在 geth account list 中可以查看。

导入钱包:

geth wallet import <etherwallet.json>

创建多签名钱包,请参见 Creating a Multi-Signature Wallet in Mist
网址:http://www.ethdocs.org/en/latest/account-management.html#creating-a-multi-signature-wallet-in-mist

列出所有账户:

geth account list

对应的控制台命令为 > eth.accounts

查看账户余额:

列出账户余额,单位是 Wei :

> eth.getBalance(<address>):

列出账户余额,单位是 eth :

> web3.fromWei(eth.getBalance(<address>), "ether")

下面的代码可以打印所有的账户余额:

function checkAllBalances() { 
var i =0; 
eth.accounts.forEach( function(e){
     console.log("  eth.accounts["+i+"]: " +  e + " \tbalance: " + web3.fromWei(eth.getBalance(e), "ether") + " ether"); 
i++; 
})
};

可以把代码存到文件中。进入 geth 的控制台后,用 > loadScript() 导入文件中的函数。

【参考】

参考:https://blog.csdn.net/cowfishy/article/details/80211116
参考:http://www.voidcn.com/article/p-atytuled-bpk.html
参考:https://segmentfault.com/a/1190000012834708

怎样实现多域名证书+http2

2018年11月30日

这个问题2年前就尝试过,但无奈放弃。

发现:https://mypark.app/
特点:免费提供域名停放和URL跳转服务,支持自动签发免费SSL证书。同时支持http2。

怎么实现的?

参考:

理论
https://blog.csdn.net/u011130578/article/details/77979325
https://www.alibabacloud.com/help/zh/faq-detail/43742.htm
https://shansing.com/read/355/
https://wiki.openssl.org/index.php/TLS1.3
https://zh.wikipedia.org/wiki/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%90%8D%E7%A7%B0%E6%8C%87%E7%A4%BA

Apache
http://blog.51cto.com/guoxh/2114630
https://www.wosign.com/faq/multisite-multidomain-https.htm
http://www.linuxdiyf.com/linux/32329.html
http://www.ttlsa.com/web/sni-multi-domain-virtual-host-ssl-tls-authentication/

Nginx
https://zhidao.baidu.com/question/1673406059627368307.html
http://www.cnblogs.com/wjoyxt/p/6134128.html
https://my.oschina.net/careyjike/blog/896507
https://www.restran.net/2017/01/24/nginx-letsencrypt-https/
http://www.ttlsa.com/web/multiple-https-host-nginx-with-a-ip-configuration/
https://www.jianshu.com/p/d40e249774ff
https://segmentfault.com/a/1190000013839445
http://www.voidcn.com/article/p-cuazhgls-np.html
http://ju.outofmemory.cn/entry/308785
https://www.diewufeiyang.com/post/971.html
https://www.tingtao.org/archives/709.html
http://www.voidcn.com/article/p-pdkgnexa-bbe.html
http://linux.it.net.cn/e/server/nginx/2014/1208/9876.html

Nginx支持多域名SSL证书是需要OpenSSL库支持的,CentOS5.X的OpenSSL库本身不支持这种特性,需要重新下载编译,步骤如下

wget https://www.openssl.org/source/old/0.9.x/openssl-0.9.8zh.tar.gz
tar zxvf ./openssl-0.9.8zh.tar.gz
cd ./openssl-0.9.8zh
./config enable-tlsext
make
make install

Nginx也要重新编译,添加OpenSSL源码的目录

./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-openssl=../openssl-0.9.8zh/

怎样使用 phpWhois

2018年11月28日

【介绍】

This package contains a Whois (RFC954) library for PHP. It allows a PHP program to create a Whois object, and obtain the output of a whois query with the Lookup function.

官网:http://www.phpwhois.org/

【下载】

源码:https://github.com/sparc/phpWhois.org/tree/master/src
源码:https://github.com/phpWhois/phpWhois/

应用:https://libraries.io/search?keywords=whois&languages=PHP

参考:http://www.loveteemo.com/article-142.html

怎样部署ENS

2018年11月28日

【介绍】

ENS(Ethereum Name Service),是建立在以太坊区块系统上的域名系统。

ENS类似DNS(Domain Name Service),但提供的不是Internet网址,而是将以太坊(Ethereum)钱包地址和智能合约地址以 NAME.eth 网址的方式表示,可以用于转帐或存取智能合约等。

官网:https://ens.domains/
源码:https://github.com/ensdomains
社区:https://gitter.im/ethereum/go-ethereum/name-registry

参考:https://ethfans.org/posts/dive-in-ens
参考:https://zhuanlan.zhihu.com/p/27528147
参考:https://www.jianshu.com/p/446811dfc742
参考:https://www.94eth.com/tutorial/shen-ru-qian-chu-yi-tai-fang-05-ens-yu-ming-xi-tong

【申请】

用户首先需要通过竞标获得.eth域名,然后再将.eth域名绑定到对应的以太坊地址。

准备一个以太币钱包地址

不要使用交易所提供的钱包来竞标ENS,不然即使竞标成功,所有权也属于交易所。

少量以太币

ENS网域的最低起标价是0.01ETH。

竞标规则

首先是写下标价,并将相应数量的以太币传入ENS票箱。三天后就可以公告这个网域竞标(揭标),其他人能看到这个网域已经开始竞标了。如果他们有兴趣,也可以加入这个网域的竞标。

最终价高者得,但出价最高的人只需要缴交第二高者的标价。ENS会自动退回所有参与者的标金,也会返回得标者标金的差额。如果得标者一年后未续约,ENS将释出此网域并退回押金。

模拟测试

参考:https://blog.csdn.net/liyuechun520/article/details/78110372

1. 查询可申请网域并且给出竞标价格

打开:https://www.myetherwallet.com/#ens

输入你想要申请的ENS网域,注意是大于等于7个字符。

2. 如果网域可用,逐步解锁,点击Start the Auction按钮开始竞标。

3. 需要花费0.01个ETH参与ENS竞标,这个ETH竞标的费用将从钱包地址中扣除。

4. 在上图中有两个时间,时间差为2天,也就是参与ENS竞标的时间为2天。

5. Copy and save this 选项中的JSON串需要拷贝并且保存下来,在后面有用。

{
    "name": "liyuechun",
    "nameSHA3": "0x9c73e1828d2734ba4ce551572cf9839949b77971a1166579bf8e992d2596cc85",
    "owner": "0xf055775ebd516e7419ae486c1d50c682d4170645",
    "value": "10000000000000000",
    "secret": "pigeon fashion wife",
    "secretSHA3": "0xea32c299c1865252936c0ef8672a52c36f0a80edea4056907750396b128bff90"
}

6. 最后点击”是的,我确定!”发送交易按钮,然后耐心等待竞标结果。

7. 查看交易信息

打开:https://etherscan.io/address/钱包地址 查看交易信息,确保处于竞标状态中。

8. 公告竞标:3天后显示竞标价格,4天后,拍卖完成。3天后一定要按时确认价格公告,在没有其他人参与竞标的情况下,当前的标的价格应该是0.01 ETH。否则之前你竞标的ETH将进入黑洞,再也找不回来。

【交易】

官网:https://www.myetherwallet.com/#domainsale
文档:https://domainsale.readthedocs.io/en/latest/
介绍:https://medium.com/@jgm.orinoco/domainsale-an-on-chain-secondary-ens-market-b3330f6e5dda
社区:https://gitter.im/wealdtech/domainsale

DomainSale is a secondary market for the Ethereum Name Service that allows you to buy and sell domains that are already owned.

How can I sell a domain?
+ 1. Transfer the domain to DomainSale
+ 2. Set immediate and/or auction prices
+ 3. Finish the auction (if applicable)

How can I buy a domain?
+ 1. Obtain details of the sale
+ 2. Buy the domain outright by providing the purchase price
+ 3a. Bid on the domain
+ 3b. Wait for the auction to finish
+ 3c. Finish the auction

怎样使用SELinux

2018年11月27日

【介绍】

安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。

参考:https://blog.csdn.net/yanjun821126/article/details/80828908

参考:https://amon.org/ssh

SELinux 有三种工作模式,分别是:

1. enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。
2. permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。
3. disabled:关闭 SELinux。

SELinux 工作模式可以在 /etc/selinux/config 中设定。
如果想从 disabled 切换到 enforcing 或者 permissive 的话,需要重启系统。反过来也一样。
enforcing 和 permissive 模式可以通过 setenforce 1|0 命令快速切换。

需要注意的是,如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文(我表示我重启了大约 10 分钟,还以为是死机了……)。

SELinux 日志的记录需要借助 auditd.service 这个服务,请不要禁用它。

【报错】

报错:setenforce: SELinux is disabled

参考:https://blog.csdn.net/qq_28423997/article/details/70176981

当启动 SELinux :

getenforce

报错:

setenforce: SELinux is disabled

说明selinux已经被彻底关闭。

开启:

编辑 /etc/selinux/config :

SELINUX=permissive

然后重启。

关闭:

编辑 /etc/selinux/config :

SELINUX=disabled

【命令】

查看 SElinux 的状态:

sestatus -v

启动:

setenforce 1

临时关闭:

setenforce 0