0%

语法规则和构建约束

构建约束(也称为构建标记)用注释行表示,格式如下:

1
// +build
  1. 构建约束以一行+build开始的注释。在+build之后列出了一些条件,在这些条件成立时,该文件应包含在编译的包中;
  2. 约束可以出现在任何源文件中,不限于go文件;
  3. +build必须出现在package语句之前,+build注释之后应要有一个空行。
  4. 只允许字母数字或_

构建约束 多个选项之间空格分隔表示为OR,多个选项之间逗号分隔表示为AND。 每个选项都是一个字母数字的单词,或者以!开头表示否定。也就是说,构建约束:

1
// +build linux,386 darwin,!cgo

等同于:

1
(linux AND 386) OR (darwin AND (NOT cgo))

一个文件可以包含多行构建约束。多行之间的约束表示为AND:

1
2
// +build linux darwin
// +build 386

等同于:

1
(linux OR darwin) AND 386

以下单词支持特殊编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- the target operating system, as spelled by runtime.GOOS
- the target architecture, as spelled by runtime.GOARCH
- the compiler being used, either "gc" or "gccgo"
- "cgo", if ctxt.CgoEnabled is true
- "go1.1", from Go version 1.1 onward
- "go1.2", from Go version 1.2 onward
- "go1.3", from Go version 1.3 onward
- "go1.4", from Go version 1.4 onward
- "go1.5", from Go version 1.5 onward
- "go1.6", from Go version 1.6 onward
- "go1.7", from Go version 1.7 onward
- "go1.8", from Go version 1.8 onward
- "go1.9", from Go version 1.9 onward
- "go1.10", from Go version 1.10 onward
- any additional words listed in ctxt.BuildTags

除去文件扩展名和_test后缀,符合以下文件名称格式的也将纳入构建约束:

1
2
3
4
5
6
7
8
9
10
11
*_GOOS
*_GOARCH
*_GOOS_GOARCH

// example
hello_darwin.go
hello_linux.go
hello_windows.go

// example
source_windows_amd64.go

GOOSGOARCH表示为已知的操作系统和体系架构值,这类的文件被认为具有需要这些隐式构建约束。

让文件不被用于构建,任何其他不满意的词也会起作用,但“忽略”是符合传统的。

1
// +build ignore

更多详细信息,可以查看go/build/build.go文件中shouldBuildmatch方法。参考:https://golang.org/pkg/go/build/

阅读全文 »

起因

MacOS和Linux一样,需要root权限使用低于1024以下端口。因此要在Mac机器上监听80端口或443端口,要么以root用户启动应用,要么使用端口转发。

在Linux系统中可以通过sudo setcap cap_net_bind_service=+ep <app name>来让非root用户使用1024以下端口(指要授权监听端口的程序)。

MacOS没有setcap命令,所以需要通过端口转发来达到目的。新版的MacOS操作系统使用pf(packet filter)设置端口转发。

简单粗暴的解决方式

1
2
3
4
echo "
rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | sudo pfctl -ef -

rdr: The packet is redirected to another destination and possibly a different port.
数据包被重定向到另一个目的地,可能还有一个不同的端口
rdr rules can optionally specify port ranges instead of single ports.
规则可以选择指定端口范围而不是单个端口
rdr … port 2000:2999 -> … port 4000 redirects ports 2000 to 2999 (inclusive) to port 4000.
… port 2000:2999 -> … port 4000 重定向端口2000-2999(包含2999)到端口4000
rdr … port 2000:2999 -> … port 4000: redirects port 2000 to 4000, 2001 to 4001, …, 2999 to 4999.
… port 2000:2999 -> … port 4000:
重定向端口2000到端口4000,端口2001到端口4001,…,端口2999到4999

阅读全文 »

之前我写了一篇关于ICAP: 互换客户端地址协议的文章。文章中介绍和详细解析了关于ICAP协议算法,并给出Go语言版本的具体实现。实际上以太坊全节点Geth提供了WEB3接口,来转换ICAP格式地址

web3.fromICAP("XE86G29C8IV34UOJMYWHGDSGME33YKEC3QO"))。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> web3
{
... ...
BigNumber: function a(e,n),
fromICAP: function(icap),
isAddress: function(address),
isChecksumAddress: function(address),
sha3: function(string, options),
toBigNumber: function(number),
toChecksumAddress: function(address)
... ...
}

> web3.fromICAP("XE86G29C8IV34UOJMYWHGDSGME33YKEC3QO")
"8982b139b2fca9452eae977827fb12280a9a1bf0"
>

不过这种方式转换ICAP格式地址,在客户端与服务端交互上有些繁琐,特别是在手机端操作时。手机端完全可以利用每一台终端设备来处理这个转换工作,直接将ICAP格式地址发送给服务端处理全部转换逻辑显得没有必要。另外,web3.fromICAP只能转换出非含校验和的以太坊账户地址,仍需要调用web3.toChecksumAddress来完成剩余工作。

因此,在这个大前提下,BOX企业数字资产保险箱 员工版APP开发了基于ICAP协议算法的一套iOS库。该库可以直接在手机端完成转换工作,不需要与后端web3接口交互。可能Geth已有iOS版本相关的库(pod Geth),不过由于这个库太大,一直没有下载成功,也没有办法验证其功能是否包含ICAP功能。使用本库的还有一个好处是简单明了,不必依赖大型库,同时转换出的以太坊地址支持checksum。

阅读全文 »

以太坊版本1.8.4开始,增加了独立签名人Clef功能,该功能目前尚处在alpha阶段。它主要实现了签署交易、签署数据和管理账户。它的README中是这样描述的:

Clef可以用来签署交易和数据,并且可以代替geth的账户管理。

这使DApps不依赖于geth的账户管理。 当DApp想要签署数据时,它可以将数据发送给签名者,然后签名者将向用户提供上下文并要求用户签署数据。 如果用户授予签名请求,签名者将签名发送回DApp。

此设置允许DApp连接到远程以太坊节点并发送本地签名的事务。 这可以在DApp连接到远程节点的情况下提供帮助,因为本地以太坊节点不可用,不与同步链或没有内置(或有限)帐户管理的特定以太坊节点同步。

Clef可以在同一台机器上作为守护进程运行,也可以在usb-stick(如usb armory)中运行,或者在QubesOS类型的os设置中运行单独的虚拟机。

乍听起来好像没什么新鲜的,目前以太坊DApp通过web3接口就可以完成的功能。通过通读代码和文档说明后发现,其实它最大的亮点有两个:

  1. 人机交互,实现对一笔发起的交易进行另一方批准确认;
  2. 规则引擎,实现自动化交易确认。
阅读全文 »

什么是ICAP?从以太坊Homestead指南的词汇表中可以看出:

Interexchange Client Address Protocol, an IBAN-compatible system for referencing and transacting to client accounts aimed to streamline the process of transferring funds, worry-free between exchanges and, ultimately, making KYC and AML concerns a thing of the past.

ICAP 互换客户端地址协议,一种IBAN兼容系统,用于引用和处理客户帐户,旨在简化资金转移流程,在交易所之间无忧无虑,并最终使KYC和AML成为过去。

这里有相关于以太坊对ICAP的介绍

在第三方账户之间(特别是交易所账户)之间转账资金给用户带来了相当大的负担,并且由于客户账户中的存款被识别的方式而容易出错。现有的银行业通过拥有一个被称为IBAN的通用代码解决了这个问题。该代码合并了机构和客户帐户以及错误检测机制,实际上消除了微不足道的错误并为用户提供了相当大的便利。不幸的是,这是一个严格监管和集中的服务,只有大型的,完善的机构才能使用。目前的议定书ICAP可被视为适用于以太坊系统中任何含有资金的机构的分散版本。

阅读全文 »

Supervisord 要求程序不能配置为守护进程,必须在前台运行并响应停止信号。只有由Supervisord或Docker直接创建的进程才能收到TERM信号,而且他们有责任正确地停止运行子进程。

这是一个问题,如果实际的服务器进程是由shell脚本产生的,就像Java服务通常情况一样:

1
2
3
4
5
6
7
8
9
#!/bin/bash

# Prepare the JVM command line
...

$JAVA_EXECUTABLE $JAVA_ARGS

# Clean up
...

在这种情况下,TERM信号由shell进程接收,但是Bash不会将该信号转发给子进程。这意味着shell进程将停止,但JVM将继续运行。

如果创建子进程的命令是shell脚本中的最后一个命令,则可以使用exec以下方法轻松解决问题:

1
2
3
#!/bin/bash
...
exec $JAVA_EXECUTABLE $JAVA_ARGS

而不是创建一个新进程,这将取代JVM中的shell进程。在这种情况下,TERM信号由JVM直接接收,问题得到解决。

阅读全文 »

安装设置 Elasticsearch

安装

安装 elasticsearch

具体可以参考官网,这里仅介绍通过rpm安装方法。

下载安装签名公钥:

1
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

签名指纹:

1
4609 5ACC 8548 582C 1A26 99A9 D27D 666C D88E 42B4
从 rpm 仓库安装

在 RedHat 基本发行版系统的 /etc/yum.repos.d/ 目录下创建 elasticsearch.repo 文件,内容包含:

1
2
3
4
5
6
7
8
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
1
sudo yum install elasticsearch

查看当前可用版本

1
yum list --showduplicates elasticsearch
手动下载 rpm 包

请参见官网

SysV init 和 systemd

Elasticsearch 安装好以后不会自动启动,如何启动和停止它取决于系统使用了哪种 SysV .查看方法

1
ps -p 1

具体设置参见官网

阅读全文 »