这里假设已经存在bootnodes服务节点了,需要给私有网络中添加一个以太坊节点,用docker来部署比较方便,不用手动去添加。这里只是写了个简单的demo,并不是一个完整基于bootnodes来部署以太坊私有网络的方法。 当然创建一个bootnode也很简单,大致步骤如下: bootnode -genkey boot.key bootnode -nodekey boot.key -verbosity 9 -addr :30310 如果需要一个完整的基于docker的一台私有网络,可以通过docker-compose将bootnode和节点来编排,后面有空来完善一下。 具体源码 => https://github.com/yuansir/bootnodes-ethereum-peer-docker Usage genesis.json 复制bootnodes链接所有节点的共同 genesis.json 文件 Dockerfile 根据需求修改 Dockerfile 中的环境变量 build image 比如tag为 eth-peer:1.0 docker build -t eth-peer:1.0 . run // docker run -it --rm --name your-name eth-peer:1.0 /bin/bash docker run -d --name your-name eth-peer:1.0 补充 如果出现以下错误: System clock seems off by -XXXXXs, which can prevent network connectivity Please enable network time synchronisation in system settings 主要是由于该节点r容器的时间和bootnodes服务节点时间不一致,如果bootnodes就是当前节点容器的宿主机,可以在docker run 时加上 -v /etc/localtime:/etc/localtime:ro,如果bootnodes服务节点和该节点坊容器不在同一主机,可以通过将两者的时间同一至同一时区的网络时间。

阅读全文

ERC721 官方简介是:A standard interface for non-fungible tokens, also known as deeds.也叫非同质代币,或者不可置换代币(NFTs)。提到ERC721,一个好理解的例子就是CryptoKitties 迷恋猫,每一只猫都是独一无二的拥有不同基因,有收藏价值属性。ERC721对于虚拟资产收藏品领域会有很好的应用价值和市场需求。 它和我写的上一篇《OpenZeppelin ERC20源码分析》介绍的ERC20有所不同,ERC721最小的单位为1无法再分割,代表独一无二的,针对不可置换的Token的智能合约标准接口。从 ERC721标准草案中可以看到,兼容ERC20的方法有4个:name,symbol,totalSupply,balanceOf 添加的新方法:ownerOf,takeOwnership ERC721还重写了approve和transfer。 分析OpenZeppelin ERC721源码前同样我画了一个继承和调用关系的思维导图,可以帮助更容易地看源码。 ERC721Basic.sol pragma solidity ^0.4.23; /** * @title ERC721 标准的基本接口 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Basic { event Transfer( address indexed _from, address indexed _to, uint256 _tokenId ); event Approval( address indexed _owner, address indexed _approved, uint256 _tokenId ); event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); function balanceOf(address _owner) public view returns (uint256 _balance); function ownerOf(uint256 _tokenId) public view returns (address _owner); function exists(uint256 _tokenId) public view returns (bool _exists); function approve(address _to, uint256 _tokenId) public; function getApproved(uint256 _tokenId) public view returns (address _operator); function setApprovalForAll(address _operator, bool _approved) public; function isApprovedForAll(address _owner, address _operator) public view returns (bool); function transferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) public; } ERC721Basic 合约定义了基本的接口方法:

阅读全文

ERC20:Ethereum Request for Comments 20,是一个基于以太坊代币的接口标准(协议)。所有符合ERC-20标准的代币都能立即兼容以太坊钱包,它能让用户和交易所,都能非常方便的管理多种代币,转账、存储、ICO等等。 OpenZeppelin的Token中实现了ERC20的一个安全的合约代码,本篇主要来分析一下源码,了解一下ERC20的实现,由于代码之间的调用可能略复杂,直接每个文件每个文件的来看会有点绕,我直接画了一个继承和调用关系的思维导图,可以帮助更容易地看源码。 ERC20Basic.sol pragma solidity ^0.4.23; contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } ERC20Basic合约主要定义了ERC20的基本接口,定义了必须要实现的方法: totalSupply 返回总共发行量 balanceOf 查询指定address的余额 transfer 发送指定数目的token到指定账户,同时发送后需要触发Transfer事件 Transfer事件,任何token发送发生时,必须触发该事件,即使是0额度。 当一个token合约创建时,应该触发一个Transfer事件,token的发送方是0x0,也就是说凭空而来的token,简称空气币。 ERC20.sol pragma solidity ^0.4.23; import "./ERC20Basic.sol"; contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public view returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function approve(address spender, uint256 value) public returns (bool); event Approval( address indexed owner, address indexed spender, uint256 value ); } ERC20合约继承了ERC20Basic,另外定义了approve相关的方法:

阅读全文

以太坊中除了基于运算能力的POW(Ethash)外,还有基于权利证明的POA共识机制,Clique是以太坊的POA共识算法的实现,这里主要对POA的Clique相关源码做一个解读分析。 Clique的初始化在 Ethereum.StartMining中,如果Ethereum.engine配置为clique.Clique, 根据当前节点的矿工地址(默认是acounts[0]), 配置clique的 签名者 : clique.Authorize(eb, wallet.SignHash) ,其中签名函数是SignHash,对给定的hash进行签名。 func (s *Ethereum) StartMining(local bool) error { eb, err := s.Etherbase()//用户地址 if err != nil { log.Error("Cannot start mining without etherbase", "err", err) return fmt.Errorf("etherbase missing: %v", err) } if clique, ok := s.engine.(*clique.Clique); ok { //如果是clique共识算法 wallet, err := s.accountManager.Find(accounts.Account{Address: eb}) // 根据用它胡地址获取wallet对象 if wallet == nil || err != nil { log.Error("Etherbase account unavailable locally", "err", err) return fmt.

阅读全文

作者的图片

Ryan是菜鸟 | LNMP技术栈笔记

一步一个脚印,一直在路上! LNMP技术栈,web架构学习笔记

菜鸟码农

南京