使用atomic来避免lock 在程序中为了互斥,难免要用锁,有些时候可以通过使用atomic来避免锁, 从而更高效. 下面给出一个以太坊中的例子,就是MsgPipeRW,从名字Pipe可以看出, 他实际上就是一个pipe,相比大家对pipe已经比较熟悉了,我就不多解释了. type MsgPipeRW struct { w chan<- Msg r <-chan Msg closing chan struct{} closed *int32 } //创建一个MsgPipeRw func Ms…
以太坊系列之十六: 使用golang与智能合约进行交互 以太坊系列之十六: 使用golang与智能合约进行交互 此例子的目录结构 token contract 智能合约的golang wrapper 部署合约 1.账户问题 2. 连接到geth 3. 部署合约 4. 测试部署结果 golang 查询合约 官方提供的使用web3来进行智能合约的部署,调用等,实际上使用go也是可以的,这样更接近geth源码,更多的库可以使用. 此例子的目录结构 方便大家对照使用 我是在windows下进行的,在li…
以太坊系列之十七: 使用web3进行智能合约的部署调用以及监听事件(Event) 上一篇介绍了使用golang进行智能合约的部署以及调用,但是使用go语言最大的一个问题是没法持续监听事件的发生. 比如我的后台程序需要监控谁给我转账了,如果使用go语言,目前就只能是轮询数据,而使用web3就简单许多,geth会把我关心的事件 主动通知给我. 以太坊系列之十七: 使用web3进行智能合约的部署调用以及监听事件(Event) token合约 编译token 部署合约 查询合约 调用合约函数 监听事件…
以太坊系列之十六: 使用golang与智能合约进行交互 以太坊系列之十六: 使用golang与智能合约进行交互 此例子的目录结构 token contract 智能合约的golang wrapper 部署合约 1.账户问题 2. 连接到geth 3. 部署合约 4. 测试部署结果 5. 等待成功部署到区块链上 golang 查询合约 调用合约 1. 直接构造合约 2. 创建账户 3.进行转账(函数调用) 4. 等待tx完成 5.通过remix来查询结果 官方提供的使用web3来进行智能合约的部署…
RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型,浮点型)的编码则交给更高层的协议:以太坊中要求数字必须是一个大端字节序的.没有零占位的存储的格式(也就是说,一个整数0和一个空数组是等同的). 如果想学习go语言中的反射用法,这个包里面倒是有比较完善的学习示例,感兴趣的可以看看. 下面是我写的一个使用示例,演示如何使用rlp这个包. /* rlp包…
百行go代码构建p2p聊天室 百行go代码构建p2p聊天室 1. 上手使用 2. whisper 原理 3. 源码解读 3.1 参数说明 3.1 连接主节点 3.2 我的标识 3.2 配置我的节点 3.3 哪个聊天室 3.3 加入聊天室 3.4 群发消息 3.5 接收消息 4. 再次使用p2pmessage 只需百行代码,就可以构建一个完整的p2p聊天室,并且消息加密,无法被追踪;并且不需要服务器,永不停机,是不是很酷. 系统实际上基于以太坊的whisper,它本来是为以太坊上的DAPPS通信构…
p2p模块 p2p模块对外暴露了Server关键结构,帮助上层管理复杂的p2p网路,使其集中于Protocol的实现,只关注于数据的传输. Server使用discover模块,在指定的UDP端口管理网络中结点的发现以及维护,discover模块能够直接和临近结点交换各自已知结点信息,从而不断的更新结点网络. Server还是用nat模块来进行TCP端口映射,而nat主要是利用upnp和pmp两个协议,如果没有,那就只能认为指定的ip就是公网ip了. Server要同时在udp和tcp的3030…
以太坊的crypto模块 该模块分为两个部分一个是实现sha3,一个是实现secp256k1(这也是比特币中使用的签名算法). 需要说明的是secp256k1有两种实现方式,一种是依赖libsecp256k1,需要cgo,另外一种是依赖github.com/btcsuite/btcd,这是一个使用go语言实现的比特币的客户端. sha3模块 这个模块实际上可以认为就是一个功能计算sha3-256,用法也很简单,就是调用crypto中的Keccak256,输出是一个32字节的hash结果 hash…
在程序中需要测量时间时最好使用monotime.Now()而不是time.Now(),相比之下前者更准确. 来个示例: func main() { var start, elapsed time.Duration start = monotime.Now() time.Sleep(time.Millisecond) elapsed = monotime.Since(start) fmt.Println(elapsed) // Prints: 1.062759ms } 可以看到,精确到毫秒级 ,以…
一步一步使用remix开发智能合约 最新版的remix(2017-8-3)只能使用在线开发了,已经没有离线版本了,并且好像在线版本要FQ才能访问(自行解决). 1.打开remix 注意地址如果是https开头的,要换成http,否则就没法访问本地的http rpc了. remix地址,打开以后会看到一个Ballot.sol文件,这是一个测试投票程序 2.打开本地的geth 本地的geth记得一定要开启rpc,下面是我自己的参数 ggeth.exe --datadir=d:/privnet --n…
solidity中的特殊函数 括号里面有类型和名字的是参数,只有类型是返回值. block.blockhash(uint blockNumber) returns (bytes32): hash of the given block - only works for 256 most recent blocks block.coinbase (address): current block miner's address block.difficulty (uint): current bloc…
evm指令集手册 Opcodes 结果列为"-"表示没有运算结果(不会在栈上产生值),为"*"是特殊情况,其他都表示运算产生唯一值,并放在栈顶. mem[a...b] 表示内存中a到b(不包含b)个字节 storage[p] 表示从p开始的32个字节 谨记evm虚拟机的word(字)是256位32字节 操作码 结果 注释 stop - stop execution, identical to return(0,0) add(x, y) x + y sub(x, y)…
solidity中变量的存储 变量存储主要分为两个区域,一个是storage(对应指定是SLOAD,SSTORE),一个是Memory(MLOAD,MSTORE), 这和普通编程语言的内存模型是不一样的. storage就像硬盘是长期存储,memory调用返回就没了. 默认情况: 函数变量以及返回值都是存储在memory 其他变量(函数的局部变量)都是storage 强制情况(也就是不能通过在声明的时候指定memory或storage): * 外部函数调用时的参数真是calldata(和memo…
dial.go阅读手记 dial.go是负责和peer建立连接关系的地方,主要是实现 type dialer interface { /* peers已经有的结点 */ newTasks(running int, peers map[discover.NodeID]*Peer, now time.Time) []task taskDone(task, time.Time) addStatic(*discover.Node) removeStatic(*discover.Node) } // di…
p2p的nat模块 该模块相对比较简单,因为nat的真正实现并不在此模块,主要是使用了第三方的nat-upnp和nat-pmp来实现真正的穿透(端口映射). 对外公布的接口 ```go // An implementation of nat.Interface can map local ports to ports // accessible from the Internet. type Interface interface { // These methods manage a mapp…
以太坊系列(ETH&ETC)在发送交易有三个对应的RPC接口,分别是ethsendTransaction.ethsendRawTransaction和personal_sendTransaction.这三个接口发送(或构造发送内容时)都需要一个参数nonce.官方文档对此参数的解释是:整数类型,允许使用相同随机数覆盖自己发送的处于pending状态的交易.仅从官网的解释,我们无法获取到更多的有效的信息.但在真实生成中我们会发现如果传错nonce字段值,通过RPC接口调用发送的交易很大可能将不会被…
以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Token(代币),本文是第四篇,Token(代币.通证)是以太坊的一大特色,既然开发钱包,则发送Token 功能必不可少. 合约 ABI 信息 首先我们需要明白,进行Token转账的时候,其实是在调用合约的转账函数,而要调用一个合约的函数,需要知道合约的 ABI 信息. 其次 通常我们所说的Token,…
以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Token(代币),这是第二篇,主要介绍钱包账号导出与导入,将对Keystore文件的生成的原理进行介绍. 如何导入Geth创建的账号? 在上一篇文章,介绍了如何使用私钥及助记词来创建账号,如果是使用已有的私钥及助记词,这其实也是账号导入的过程. 有一些同学会问,我的账号是Geth生成的,如何导入到钱包呢…
最近在看以太坊(Ethereum)的源代码, 初初看出点眉目. 区块链是近年热点之一,面向大众读者介绍概念的文章无数,有兴趣的朋友可自行搜索.我会从源代码实现入手,较系统的介绍一下以太坊的系统设计和协议实现等,希望能提供有一定深度的内容,欢迎有兴趣的朋友多多讨论. 注:1.源代码在github上, 分C++和Golang两个版本,这里我选择的是Go语言版(github.com/ethereum/go-ethereum),以下文中提到的Ethereum 代码部分,如无特别说明,均指go-ether…
死磕以太坊源码分析之Ethash共识算法 代码分支:https://github.com/ethereum/go-ethereum/tree/v1.9.9 引言 目前以太坊中有两个共识算法的实现:clique和ethash.而ethash是目前以太坊主网(Homestead版本)的POW共识算法. 目录结构 ethash模块位于以太坊项目目录下的consensus/ethash目录下. algorithm.go 实现了Dagger-Hashimoto算法的所有功能,比如生成cache和datas…
艾伯特AI人工智能(公众号:aibbtcom)按: (编者按:本文为姗姗来迟的Meetup系列推文.12月3日,林修平在亚太区以太坊社区培训与交流Meetup深圳站上跟我们分享了他对以太坊各种钱包模式的介绍,还分析了Parity多签名钱包安全事件的技术原因.昨日,EthFans得到作者授权,分享他的PPT.鉴于PPT较长,为保证阅读体验,编者在其中加入了小标题.) 不同钱包模式的比较 多签名钱包基本介绍 以太坊多签名钱包及其实现方式 以太坊多签名钱包范例 金库模式 包含第三方的金库模式 针对多签…
本文具体分析以太坊的共识算法之一:实现了POW的以太坊共识引擎ethash. 关键字:ethash,共识算法,pow,Dagger Hashimoto,ASIC,struct{},nonce,FNV hash,位运算,epoch Ethash 前面我们分析了以太坊挖矿的源码,挖了一个共识引擎的坑,研究了DAG有向无环图的算法,这些都是本文要研究的Ethash的基础.Ethash是目前以太坊基于POW工作量证明的一个共识引擎(也叫挖矿算法).它的前身是Dagger Hashimoto算法. Dag…
上文我们总结了以太坊最主要的共识算法:ethash算法,本文将重点分析以太坊的另一个共识算法:clique. 关键字:clique,共识算法,puppeth,以太坊地址原理,区块校验,认证结点,POA,选举投票,snapshot,Comma-ok断言 clique 以太坊的官方共识算法是ethash算法,这在前文已经有了详细的分析: 它是基于POW的共识机制的,矿工需要通过计算nonce值来消耗大量算力来匹配target值. 如果在联盟链或者私链的方案里,继续使用ethash就会很浪费算力,PO…
本系列文章介绍以太坊区块链基于Java语言的解决方案.通过介绍EthereumJ定义的主要模块和Class,希望为大家学习和使用EthereumJ提供一些帮助. 整体架构 以太坊的Java解决方案主要是由两个项目来实现的: l  EthereumJ(https://github.com/ethereum/ethereumj),实现了Ethereum定义的核心协议,完成了区块链的核心功能. l  Ethereum Harmony(https://github.com/ether-camp/ethe…
以太坊 EVM原理与实现 以太坊底层通过EVM模块支持合约的执行与调用,调用时根据合约地址获取到代码,生成环境后载入到EVM中运行.通常智能合约的开发流程是用solidlity编写逻辑代码,再通过编译器编译元数据,最后再发布到以太坊上. 代码结构 . ├── analysis.go //跳转目标判定 ├── common.go ├── contract.go //合约数据结构 ├── contracts.go //预编译好的合约 ├── errors.go ├── evm.go //执行器 对外…
今天讲解在 mac系统下如何安装以太坊平台( Ethereum client) 1.以太坊客户端的介绍 从项目早期,为了适应不同系列的开发语言和操作系统,以太坊的团队就实现过很多客户端.如下面我们看到的表格,有很多实用各种语言来实现的以太坊客户端,客户端的多样性对于以太坊生态系统来说是一个巨大优势.但是,对于像我们这样的终端用户来说,可能觉得会很迷惑,以为我们不知道选择哪一个? 1.1 台式机或笔记本客户端 如果你的电脑是台式机或笔记本,那么Mist/Ethereum 钱包可以满足我们大多数人的…
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguanh/ GitHub : https://github.com/af913337456/ 腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities 虫洞区块链专栏:https://www.chongdongshequ.com/…
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguanh/ GitHub : https://github.com/af913337456/ 腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities 目录 前序 数据签名 整体流程 非对称加密 RLP 序列化 数据验证 数据篡改…
在这一部分,我们将使用C#开发一个最简单的.Net控制台应用,来接入以太坊节点,并打印 所连接节点旳版本信息.通过这一部分的学习,你将掌握以下技能: 如何使用节点仿真器 如何在命令行访问以太坊节点 如何在C#代码中访问以太坊节点 我们将使用ganache来模拟以太坊节点.ganache虽然不是一个真正的以太坊节点软件, 但它完整实现了以太坊的JSON RPC接口,非常适合以太坊智能合约与去中心化应用开发的 学习与快速验证: ganache启动后将在8545端口监听http请求,因此,我们会将JS…
背景 以太坊技术搭建的区块链网络,节点间需要保证时间一致,才能正常有序的发送交易和生成区块,使得众多节点共同维护分布式账本(区块数据+状态数据).但是,网络中节点的系统时间不一致回出现什么现象呢,我们通过2个例子来分析一下. 问题现象: 1. 以太坊节点启动时,报出时间未同步的警告日志: WARN [03-20|17:20:54] System clock seems off by -1m7.049442998s, which can prevent network connectivity W…