用Go来做以太坊开发⑩工具函数集合

工具函数集

函数的实现可以在这里. 它们一般接口比较通用. 这里我们先看几个例子。

检查地址是否是有效的以太坊地址:

valid := util.IsValidAddress("0x323b5d4c32345ced77393b3530b1eed0f346429d")
fmt.Println(valid) // true

检查地址是否为零地址:

zeroed := util.IsZeroAddress("0x0")
fmt.Println(zeroed) // true

将小数转换为wei(整数)。 第二个参数是小数位数。

wei := util.ToWei(0.02, 18)
fmt.Println(wei) // 20000000000000000

将wei(整数)转换为小数。 第二个参数是小数位数。

wei := new(big.Int)
wei.SetString("20000000000000000", 10)
eth := util.ToDecimal(wei, 18)
fmt.Println(eth) // 0.02

根据燃气上限和燃气价格计算燃气花费。

gasLimit := uint64(21000)
gasPrice := new(big.Int)
gasPrice.SetString("2000000000", 10)
gasCost := util.CalcGasCost(gasLimit, gasPrice)
fmt.Println(gasCost) // 42000000000000

从签名中提取R,S和V值。

sig := "0x789a80053e4927d0a898db8e065e948f5cf086e32f9ccaa54c1908e22ac430c62621578113ddbb62d509bf6049b8fb544ab06d36f916685a2eb8e57ffadde02301"
r, s, v := util.SigRSV(sig)
fmt.Println(hexutil.Encode(r[:])[2:]) // 789a80053e4927d0a898db8e065e948f5cf086e32f9ccaa54c1908e22ac430c6
fmt.Println(hexutil.Encode(s[:])[2:]) // 2621578113ddbb62d509bf6049b8fb544ab06d36f916685a2eb8e57ffadde023
fmt.Println(v)                        // 28

完整代码

util.go

package util

import (
    "math/big"
    "reflect"
    "regexp"
    "strconv"

    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/common/hexutil"
    "github.com/shopspring/decimal"
)

// IsValidAddress validate hex address
func IsValidAddress(iaddress interface{}) bool {
    re := regexp.MustCompile("^0x[0-9a-fA-F]{40}$")
    switch v := iaddress.(type) {
    case string:
        return re.MatchString(v)
    case common.Address:
        return re.MatchString(v.Hex())
    default:
        return false
    }
}

// IsZeroAddress validate if it's a 0 address
func IsZeroAddress(iaddress interface{}) bool {
    var address common.Address
    switch v := iaddress.(type) {
    case string:
        address = common.HexToAddress(v)
    case common.Address:
        address = v
    default:
        return false
    }

    zeroAddressBytes := common.FromHex("0x0000000000000000000000000000000000000000")
    addressBytes := address.Bytes()
    return reflect.DeepEqual(addressBytes, zeroAddressBytes)
}

// ToDecimal wei to decimals
func ToDecimal(ivalue interface{}, decimals int) decimal.Decimal {
    value := new(big.Int)
    switch v := ivalue.(type) {
    case string:
        value.SetString(v, 10)
    case *big.Int:
        value = v
    }

    mul := decimal.NewFromFloat(float64(10)).Pow(decimal.NewFromFloat(float64(decimals)))
    num, _ := decimal.NewFromString(value.String())
    result := num.Div(mul)

    return result
}

// ToWei decimals to wei
func ToWei(iamount interface{}, decimals int) *big.Int {
    amount := decimal.NewFromFloat(0)
    switch v := iamount.(type) {
    case string:
        amount, _ = decimal.NewFromString(v)
    case float64:
        amount = decimal.NewFromFloat(v)
    case int64:
        amount = decimal.NewFromFloat(float64(v))
    case decimal.Decimal:
        amount = v
    case *decimal.Decimal:
        amount = *v
    }

    mul := decimal.NewFromFloat(float64(10)).Pow(decimal.NewFromFloat(float64(decimals)))
    result := amount.Mul(mul)

    wei := new(big.Int)
    wei.SetString(result.String(), 10)

    return wei
}

// CalcGasCost calculate gas cost given gas limit (units) and gas price (wei)
func CalcGasCost(gasLimit uint64, gasPrice *big.Int) *big.Int {
    gasLimitBig := big.NewInt(int64(gasLimit))
    return gasLimitBig.Mul(gasLimitBig, gasPrice)
}

// SigRSV signatures R S V returned as arrays
func SigRSV(isig interface{}) ([32]byte, [32]byte, uint8) {
    var sig []byte
    switch v := isig.(type) {
    case []byte:
        sig = v
    case string:
        sig, _ = hexutil.Decode(v)
    }

    sigstr := common.Bytes2Hex(sig)
    rS := sigstr[0:64]
    sS := sigstr[64:128]
    R := [32]byte{}
    S := [32]byte{}
    copy(R[:], common.FromHex(rS))
    copy(S[:], common.FromHex(sS))
    vStr := sigstr[128:130]
    vI, _ := strconv.Atoi(vStr)
    V := uint8(vI + 27)

    return R, S, V
}

test file: util_test.go

词汇表

Addresses 地址

以来在以太坊中收发交易的地址,通常有数字和字母组成,也可以表示为一个二维码,由ECDSA密匙对衍生。

Agreement Ledgers 共识账本

由两方或者多方来进行协商和达成共识的记账本。

Altcoin 代币

比特币替代品的缩写。目前大部分的代币都是比特币经过一些对做工证明微小改动的的分叉。其中最引人瞩目的是莱特币。莱特币对原来比特币的改动包括减少出块时间,增加最大的币的数量,和一个不同的哈希算法。

Attestation Ledgers 查证账本

一个专门为协议,承诺或者声明等,提供证明存在证据的(用来认证)的分布式账本。

ASIC 应用特制集成电路

"Application Specific Integrated Circuit"应用特制集成电路的缩写。ASICs是专门为某个单独的应用设计的硅芯片。就比特币来说,它们通常指专门用来计算SHA-256来进行挖比特币的芯片。

Bitcoin 比特币

目前最著名的虚拟货币,基于做工证明(proof-of-work)。

Blockchain 区块链

一种不可篡改,用一个叫区块的结构数字化存储数据的分布式账本。每个区块再被数字签名“链”到下一个区块。这是的区块链可以用来做记账本,并切可以被有合适权限的个体分享,和使用。

Block Ciphers 区块加密器

一种对一整个区块的数据一起作为一个组群来进行用密匙和算法进行文本加密的的方法。而不是一个比特一个比特的算。

Block Height 区块高度

用来指区块链中链在一起的区块的个数。比如,高度0就是指第一个区块,通常也叫创世区块。

Block Rewards 区块奖励

当矿工成功算出一个块得到的奖励。取决于具体的币种,还有是否所有的币都已经被挖完,区块奖励可以是币和交易费的混合。目前比特币网络的区块奖励是25个比特币每个块。

Central Ledger 中央记账本

特制由一个中样机构维护的记账本。

Chain Linking 跨链

吧两天不同区块链连到一起,并且允许跨链交易的的过程。这会允许像比特币这类的区块链与其他侧链通信并进行资产交易。

Cipher 加密器

用来加密和解密信息的算法。通常讲,“cipher”也可以指一个加密消息,或者“编码”。

Confirmation 确认

区块种的交易会被区块链网络确认。在一个做工证明的系统(如比特币)中,这个确认过程也被称为挖矿。一旦一笔交易被确认,它就不可以被逆转或者双花。交易被区块记录后的块数的个数,也叫确认的次数。比如,交易是3个区块前被确认的,那么我们就说交易有三个“确认”。确认的数量越多,双花攻击的难度就越大。

Consensus Process 共识过程

一群负责维护一个分布式记账本的节点对记账本状态和内容达成共识的过程。

Consortium Blockchain 联盟链

一个共识过程有一组提前选出的节点控制的区块链。比如,你可以想象一个由15个金融机构组成的联盟,每个机构运营自己的节点,但是每个区块一定要有15个机构中的10个签名才能生效。也有混合模式,比如区块的根哈希是公开的,并且提供一个允许公共成员进行查询,并且获取加密证明部分区块链状态的的API。这类的区块链可以称为“半去中心化”。

Cryptoanalysis 加密分析学

一门通过分析,在不用私钥的情况下获取加密信息的学科。

Cryptocurrency 加密货币

一种基于数学的数字货币形式,其中加密技术用于规范货币单位的生成并验证资金的转移。 此外,加密货币独立于中央银行运作。

Cryptography 加密学

指加密和解密信息的过程。

dApp 去中心应用

去中心化的应用程序必须是完全开源的,它必须自主运行,并且没有实体控制其大部分代币。

DAO 去中心独立组织

(分散的自治组织)可以被认为是在不可破坏的业务规则的控制下的,没有任何人为控制运行的组织。

The DAO (一个风投基金的名字)

一个基于以太坊的风险投机构。它们造成了很多的软分叉和硬分叉。

Decryption 解密

将密文重新转换为明文的过程。

Encryption 加密

将明文消息(明文)转换为看起来像无意义的随机比特序列数据流(密文)的过程。

ERC 以太坊协商意见请求(Ethereum Request for Comments)的缩写

ERC是Ethereum Request for Comments的缩写. 一个ERC是一个对Ethereum的提案。

ERC-20 第20号ERC,目前大部分以太坊代币都遵守的规范

一个以太坊代币的标准。

Ether 以太币

以太坊区块链的原生代币,用于支付网络上的交易费,矿工奖励和其他服务。

Ethereum 以太坊

基于区块链技术的开放式软件平台,使开发人员能够编写智能合约,构建和部署分散式应用程序。

Ethereum Classic 以太坊经典版

一个经过硬分叉后的以太坊。

EVM 以太坊虚拟机

用来运行以太坊二进制码的以太坊虚拟机。

EVM Bytecode 以太坊虚拟机二进制码

以太坊区块链上的帐户可以包含的编程语言代码。每次向帐户发送消息时,都会执行与帐户关联的EVM代码,并且能够读取/写入存储,并自行发送消息。

Digital Commodity 数字商品

通常指稀缺,电子可转让,无形,具有市场价值的数字商品。

Digital Identity 数字身份

由个人,组织或电子设备在网络空间中采用或声明的在线或网络身份。

Distributed Ledgers 分布式记账本

一种分布在多个站点,国家或机构的数据库。 记录一个接一个地存储在连续的分类帐中。 分布式分类帐数据可以是“需许可”或“不需许可”。这指以控制(谁可以查看)账本的方式区分。

Difficulty 难度

指在Proof-of-Work挖矿中,挖掘区块链网络中的块的难度。 在比特币网络中,挖掘的难度每2016块都会调整。 这是为了将块验证时间保持在十分钟。快了就更难一点,慢了就简单一点。

Double Spend 双花

指比特币网络中的某个场景,有人试图同时向两个不同的收件人发送比特币交易。 但是,一旦比特币交易得到确认,就几乎不可能再花费它。 交易的确认越多,双倍花费比特币变得越困难。

Fiat currency 法币

是政府宣布为履行财务义务,如美元或欧元。

Fork 分叉

通过在网络的不同部分同时创建两个块,创建区块链的持续替代版本。 这会在分叉的节点之后创建了两个并行的区块链,其中一个是获胜的区块链。

Gas 以太坊“燃气”

一直以太坊的计量方式,大致相当于计算量步骤(对于以太坊)。 每项交易都必须包括燃气限额和愿意支付的单位燃气费用; 矿工会根据费用,去选择包括的交易。 每项操作都有燃气开支; 对于大多数操作而言,它是在3-10,尽管一些昂贵的操作有高达700的支出,而以太币交易本身的支出为21000个燃气。

Gas Cost “燃气” 花费

燃气费用是燃气上限乘以燃气价格。

Gas Limit ”燃气“上限

事务在智能合约执行中应该耗尽的最大燃气上限。

Gas Price ”燃气“ 价格

The price per computational unit.

Geth Go以太坊客户端的简称

一个Go实现的以太坊客户端。 https://github.com/ethereum/go-ethereum

Go 狗语言(笑)

Go是由Robert Griesemer,Rob Pike和Ken Thompson于2009年在Google创建的一种编程语言。

Golang Go编程语言

Go编程语言。

go-ethereum Go实现的以太坊客户端

Go实现的以太坊客户端项目名。

Halving (收益)减半

比特币的供应量有限,这使得它们成为稀缺的数字商品。 发行的比特币总量为2100万。 每个块产生的比特币数量每四年减少50%。 这称为“减半”。 最后一半将在2140年进行。

Hard fork 硬分叉

通过对区块链协议的更改使先前无效的块/事务有效,因此需要所有用户升级其客户端。

Hashcash 哈希现金

用于限制电子邮件垃圾邮件和拒绝服务攻击的基于工作量证明的区块链系统,并且最近因其在比特币(和其他加密货币)中作为挖掘算法的一部分使用而闻名。

Hashrate 哈希速率(一种对算力的描述)

比特币矿工在给定时间内(通常是一秒钟)可以计算的哈希数。

HD Wallet 硬件钱包

硬件钱包或分级确定性钱包是一种新的数字钱包,它自动生成私有/公共地址(或密钥)的树状结构,从而解决用户必须自己生成它们的问题。

Infura 一个提供以太坊全节点服务

Infura为以太坊网络提供安全,可靠和可扩展的网关。 https://infura.io/

Initial Coin Offering 发币

(ICO)是一种新的加密货币从其整体币库中销售预付代币的事件,以换取前期资本。 ICO经常被用于新加密货币的开发者以筹集资金。

IPFS 星际文件系统的缩写

行星际文件系统(IPFS)是一种协议和网络,旨在创建一种在分布式文件系统中点对点的存储和共享,内容可寻址的,超媒体的的对等方法。

Keccak-256 一个以太坊常用加密哈希算法的名词

以太坊中使用的哈希算法。

Keystore 密匙库

包含加密钱包私钥和钱包元数据的文件。

Kovan 科文(一个以太坊测试网的名称)

一个基于权威证明的以太坊测试网. 只有Parity支持.

Ledger 记账本

仅允许附加记录存储(append only),其中记录是不可变的,并且记录除财务记录外更多的一般信息。

Litecoin 莱特币

一个基于Scrypt算法和做工证明的点对点加密货币。有时被称为加密货币的白银(如果比特币是黄金的话)。

Mining 挖矿

不断寻找符合标准的特殊哈希值,并验证交易并将其添加到区块链的过程。 使用计算硬件计算加密问题的这一过程也会触发加密货币的生成(挖矿奖励)。

Mnemonic 助记符(通常用来恢复密匙)

助记符短语,助记符恢复短语或助记符种子是用作生成HD钱包的主私钥和主链代码的种子的单词列表。

Multi-signature 多签名

(multisig)多签名地址允许对多方要求密钥来授权交易。 在创建地址时决定所需数量的签名。 多签名地址具有更大的防盗能力。

Node 节点

任何连接到区块链网络的计算机。

Nonce 去重数(一个只能用一次的数字)

一个只使用一次的数字。

Full node 全节点

一个完全执行区块链所有规则的节点。

Parity 奇偶(一个Rust实现的以太坊客户端)

用Rust语言编写的以太坊实现。 https://github.com/paritytech/parity

P2P 点对点的缩写

P2P 是Peer to Peer(点对点)的缩写.

Peer-to-peer 点对点

指在高度互连的网络中至少两方之间发生的去中心化的交互。 P2P参与者通过一个中介点直接相互交往。

Permissioned Ledger 需要请求权限的记账本

是一个分类帐,其中参与者必须具有访问分类帐的权限。 许可的分类帐可能有一个或多个所有者。 添加新记录时,有限共识流程会检查分类帐的完整性。 这是由可信赖的参与者 - 例如政府部门或银行 - 进行的,这使得保持共享记录比未经许可的分类账使用的共识过程简单得多。

Permissioned Blockchains 需要请求权限的区块链

提供高度可验证的数据集,因为共识流程创建了数字签名,所有各方都可以看到。

Private Key 私钥

一串数据,显示您可以支配特定钱包中的比特币。 私钥可以被认为是密码; 除了您之外,不要向任何人泄露私钥,因为它们允许您通过加密签名从比特币钱包中使用比特币。

Proof of Authority 权威证明

私有区块链中的共识机制,它基本上为一个客户端(或特定数量的客户端)提供了一个特定私钥,以便在区块链中生成所有块。

Proof of Stake 利权证明

工作量证明系统的替代方案,其中您使用加密货币的现有股份(您持有的货币金额)来计算您可以开采的货币金额。

Proof of Work 做工证明

将采矿能力与计算能力联系起来的系统。 必须对块进行散列,这本身就是一个简单的计算过程,但是在散列过程中添加了一个额外的变量,使其更加困难。 成功散列块时,散列必须花费一些时间和计算量。 因此,散列块被认为是工作的证据。

Protocols 协议

描述如何传输或交换数据的正式规则集,尤其是在网络中。

Rinkeby 一个以太坊测试网的名称

以太坊区块链上的权威证明的测试网。 仅由Geth支持。

RLP 递归长度前缀编码标准的缩写

Recursive Length Prefix (RLP) 是一种编码任意嵌套的二进制数据数组的标准。 RLP是用于序列化以太坊中对象的主要编码方法。

Ropsten 一个做工证明的以太坊测试网

以太坊区块链上的工作证明的测试网,可以最好地模拟生产环境。 由Geth和Parity支持。

Scrypt 一个做工证明的哈希算法

SHA-256的另一种工作系统证明,旨在对CPU和GPU矿工特别友好,同时为尽力无视ASIC矿工提的优势。

SHA256 一个加密哈希方程的名称(应用于比特币)

一个加密函数,比特币工作系统证明的基础。

Signature 签名

数字签名是用于呈现数字消息或文档的真实性的数学方案。

Smart contract 智能合约

合约的条款以计算机语言或代码,而非法律语言记录。 智能合约可以由计算系统自动执行,例如合适的分布式分类帐系统。

Soft fork 软分叉

对比特币协议的改变,其中仅使先前有效的块/事务无效。 由于旧节点将新块识别为有效,因此softfork是向后兼容的。 这种分支只需要大多数矿工升级来执行新规则。

Sokol 一个只有Parity 客户端支持的以太坊测试网

一个以太坊区块链上的权威证明的测试网。 仅受Parity客户端支持。

Stream ciphers 数据流加密器

一种加密文本(密文)的方法,其中加密密钥和算法一次一位地应用于数据流中的每个二进制数字。

Swarm 直译为虫群,以太坊中的分布式文件存储组件

去中心化的文件存储,以太坊的一部分。

Token 代币

是可以拥有的东西的数字身份。

Tokenless Ledger 无代币记账本

指的是不需要本地货币运行的分布式分类帐。

Transaction Block 交易块

比特币网络上的一系列交易,聚集到一个块中,然后可以对其进行哈希处理并添加到区块链中。

Transaction Fees 交易费

通过比特币网络发送的一些交易收取的小额费用。 交易费用将授予成功包含相关交易的区块的矿工。

Unpermissioned ledgers 无权限记账本

没有单一所有者的区块链; 不能被任何个体拥有。 无需许可的分类帐的目的是允许任何人向分类帐和拥有分类帐的每个人提供相同副本的数据。

Wallet 钱包

包含私钥集合的文件。

Whisper 直译为悄悄话,以太坊中的一个点对点消息系统

作为以太坊的一部分的,点对点消息传递系统。


资源

Ethereum, Solidity 还有 Go的学习资源列表。

参考规范

  • 智能合约参考规范
  • 安全考虑
  • Solidity的一些坑

寻求帮助和问题解答

  • StackExchange
    • 以太坊
  • Reddit
    • ethdev
    • golang
  • Gitter
    • List of Gitter channels

社区

  • Reddit
    • ethereum
    • ethtrader
  • Twitter
    • ethereum

  • go-ethereum
  • go-solidity-sha3
  • go-ethereum-hdwallet
  • go-ethutil

开发者工具

  • Truffle
  • Infura
  • Remix IDE
  • Keccak-256 Online

添加小编微信:grey0805,加入知识学习小分队~!

你可能感兴趣的