• J
    jimi2018

    INTRO 介绍

    Started 入门

    Ethereum 以太坊进阶

    TUTORIAL 教程

    Ethereum 以太坊

    Videos 视频

    PROJECT 项目

    Chain 区块链底层

    • Metaverse 原界链源码
    • EOS EOS链源码
    • BYTOM 比原链源码
    • CITA cita联盟链的底层源码
    • 比特币0.1 最原始的比特币代码
    • Blockbench 区块链性能测试工具
    • Quorum 来自JP Morgan基于Go-Ethereum数据隐私加强的以太坊实现
    • BCOS 来自微众银行的增强版以太坊实现
    • Presto-Ethereum 以太坊增加Presto的SQL访问能力
    • IPFS IPFS的GO语言实现 原理

    SDK 工具包

    • Remix 浏览器编译器
    • Truffle 以太坊Dapp开发脚手架
    • Zeppelin 用于编写安全的以太坊合约框架
    • Web3j 以太坊官方Web3轻量级java SDK
    • Embark 以太坊Dapp开发框架,支持IPFS、Whisper及Orbit调用
    • Web3Swift 一个Web3的swift SDK
    • Porosity 反编译以太坊智能合约工具
    • Solidity-Coverage 检测Solidity代码覆盖
    • Composer 官方可视化Fabric应用开发框架
    • Cakeshop 来自JP Morgan的以太坊可视化管理工具
    • Zokrates 以太坊使用zkSNARKS工具包(实验用)
    • libsnark zkSNARKS C++库

    DOCUMENT 资料

    Ethereum 以太坊

    APPLICATION 应用

    Explorer 链浏览

    Wallet 钱包

    Social 社会

    Exchange 交易所

    Cross Chain 跨链

    Token 代币

    发布在 编程 阅读更多
  • J
    jimi2018

    Geth是在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具。
    熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册。 本文主要是对geth help的翻译,基于最新的geth 1.7.3-stable版本。

    如果你还不知道geth是干什么的,请先阅读入门篇:什么是以太坊?什么是智能合约?
    以下开始正文。

    命令用法

    geth [选项] 命令 [命令选项] [参数…]

    版本:

    1.7.3-stable

    命令:

    account 管理账户
    attach 启动交互式Javascrip{过滤}t环境(连接到节点)
    bug 上报bug Issues
    console 启动交互式Javascrip{过滤}t环境
    copydb 从文件夹创建本地链
    dump Dump(分析)一个特定的块存储
    dumpconfig 显示配置值
    export 导出区块链到文件
    import 导入一个区块链文件
    init 启动并初始化一个新的创世纪块
    js 执行指定的Javascrip{过滤}t文件(多个)
    license 显示许可信息
    makecache 生成ethash验证缓存(用于测试)
    makedag 生成ethash 挖矿DAG(用于测试)
    monitor 监控和可视化节点指标
    removedb 删除区块链和状态数据库
    version 打印版本号
    wallet 管理Ethereum预售钱包
    help,h 显示一个命令或帮助一个命令列表

    ETHEREUM选项:

    --config value TOML 配置文件
    --datadir “xxx” 数据库和keystore密钥的数据目录
    --keystore keystore存放目录(默认在datadir内)
    --nousb 禁用监控和管理USB硬件钱包
    --networkid value 网络标识符(整型, 1=Frontier, 2=Morden (弃用), 3=Ropsten, 4=Rinkeby) (默认: 1)
    --testnet Ropsten网络:预先配置的POW(proof-of-work)测试网络
    --rinkeby Rinkeby网络: 预先配置的POA(proof-of-authority)测试网络
    --syncmode "fast" 同步模式 ("fast", "full", or "light")
    --ethstats value 上报ethstats service URL (nodename:[email protected]:port)
    --identity value 自定义节点名
    --lightserv value 允许LES请求时间最大百分比(0 – 90)(默认值:0)
    --lightpeers value 最大LES client peers数量(默认值:20)
    --lightkdf 在KDF强度消费时降低key-derivation RAM&CPU使用

    开发者(模式)选项:

    --dev 使用POA共识网络,默认预分配一个开发者账户并且会自动开启挖矿。
    --dev.period value 开发者模式下挖矿周期 (0 = 仅在交易时) (默认: 0)

    ETHASH 选项:

    --ethash.cachedir ethash验证缓存目录(默认 = datadir目录内)
    --ethash.cachesinmem value 在内存保存的最近的ethash缓存个数 (每个缓存16MB ) (默认: 2)
    --ethash.cachesondisk value 在磁盘保存的最近的ethash缓存个数 (每个缓存16MB) (默认: 3)
    --ethash.dagdir "" 存ethash DAGs目录 (默认 = 用户hom目录)
    --ethash.dagsinmem value 在内存保存的最近的ethash DAGs 个数 (每个1GB以上) (默认: 1)
    --ethash.dagsondisk value 在磁盘保存的最近的ethash DAGs 个数 (每个1GB以上) (默认: 2)

    交易池选项:

    --txpool.nolocals 为本地提交交易禁用价格豁免
    --txpool.journal value 本地交易的磁盘日志:用于节点重启 (默认: "transactions.rlp")
    --txpool.rejournal value 重新生成本地交易日志的时间间隔 (默认: 1小时)
    --txpool.pricelimit value 加入交易池的最小的gas价格限制(默认: 1)
    --txpool.pricebump value 价格波动百分比(相对之前已有交易) (默认: 10)
    --txpool.accountslots value 每个帐户保证可执行的最少交易槽数量 (默认: 16)
    --txpool.globalslots value 所有帐户可执行的最大交易槽数量 (默认: 4096)
    --txpool.accountqueue value 每个帐户允许的最多非可执行交易槽数量 (默认: 64)
    --txpool.globalqueue value 所有帐户非可执行交易最大槽数量 (默认: 1024)
    --txpool.lifetime value 非可执行交易最大入队时间(默认: 3小时)

    性能调优的选项:

    --cache value 分配给内部缓存的内存MB数量,缓存值(最低16 mb /数据库强制要求)(默认:128)
    --trie-cache-gens value 保持在内存中产生的trie node数量(默认:120)

    帐户选项:

    --unlock value 需解锁账户用逗号分隔
    --password value 用于非交互式密码输入的密码文件

    API和控制台选项:

    --rpc 启用HTTP-RPC服务器
    --rpcaddr value HTTP-RPC服务器接口地址(默认值:“localhost”)
    --rpcport value HTTP-RPC服务器监听端口(默认值:8545)
    --rpcapi value 基于HTTP-RPC接口提供的API
    --ws 启用WS-RPC服务器
    --wsaddr value WS-RPC服务器监听接口地址(默认值:“localhost”)
    --wsport value WS-RPC服务器监听端口(默认值:8546)
    --wsapi value 基于WS-RPC的接口提供的API
    --wsorigins value websockets请求允许的源
    --ipcdisable 禁用IPC-RPC服务器
    --ipcpath 包含在datadir里的IPC socket/pipe文件名(转义过的显式路径)
    --rpccorsdomain value 允许跨域请求的域名列表(逗号分隔)(浏览器强制)
    --jspath loadscrip{过滤}t Javascrip{过滤}t加载脚本的根路径(默认值:“.”)
    --exec value 执行Javascrip{过滤}t语句(只能结合console/attach使用)
    --preload value 预加载到控制台的Javascrip{过滤}t文件列表(逗号分隔)

    网络选项:

    --bootnodes value 用于P2P发现引导的enode urls(逗号分隔)(对于light servers用v4+v5代替)
    --bootnodesv4 value 用于P2P v4发现引导的enode urls(逗号分隔) (light server, 全节点)
    --bootnodesv5 value 用于P2P v5发现引导的enode urls(逗号分隔) (light server, 轻节点)
    --port value 网卡监听端口(默认值:30303)
    --maxpeers value 最大的网络节点数量(如果设置为0,网络将被禁用)(默认值:25)
    --maxpendpeers value 最大尝试连接的数量(如果设置为0,则将使用默认值)(默认值:0)
    --nat value NAT端口映射机制 (any|none|upnp|pmp|extip:<IP>) (默认: “any”)
    --nodiscover 禁用节点发现机制(手动添加节点)
    --v5disc 启用实验性的RLPx V5(Topic发现)机制
    --nodekey value P2P节点密钥文件
    --nodekeyhex value 十六进制的P2P节点密钥(用于测试)

    矿工选项:

    --mine 打开挖矿
    --minerthreads value 挖矿使用的CPU线程数量(默认值:8)
    --etherbase value 挖矿奖励地址(默认=第一个创建的帐户)(默认值:“0”)
    --targetgaslimit value 目标gas限制:设置最低gas限制(低于这个不会被挖?) (默认值:“4712388”)
    --gasprice value 挖矿接受交易的最低gas价格
    --extradata value 矿工设置的额外块数据(默认=client version)

    GAS价格选项:

    --gpoblocks value 用于检查gas价格的最近块的个数 (默认: 10)
    --gpopercentile value 建议gas价参考最近交易的gas价的百分位数,(默认: 50)

    虚拟机的选项:

    --vmdebug 记录VM及合约调试信息

    日志和调试选项:

    --metrics 启用metrics收集和报告
    --fakepow 禁用proof-of-work验证
    --verbosity value 日志详细度:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3)
    --vmodule value 每个模块详细度:以 <pattern>=<level>的逗号分隔列表 (比如 eth/*=6,p2p=5)
    --backtrace value 请求特定日志记录堆栈跟踪 (比如 “block.go:271”)
    --debug 突出显示调用位置日志(文件名及行号)
    --pprof 启用pprof HTTP服务器
    --pprofaddr value pprof HTTP服务器监听接口(默认值:127.0.0.1)
    --pprofport value pprof HTTP服务器监听端口(默认值:6060)
    --memprofilerate value 按指定频率打开memory profiling (默认:524288)
    --blockprofilerate value 按指定频率打开block profiling (默认值:0)
    --cpuprofile value 将CPU profile写入指定文件
    --trace value 将execution trace写入指定文件

    WHISPER实验选项:

    --shh 启用Whisper
    --shh.maxmessagesize value 可接受的最大的消息大小 (默认值: 1048576)
    --shh.pow value 可接受的最小的POW (默认值: 0.2)

    弃用选项:

    --fast 开启快速同步
    --light 启用轻客户端模式

    其他选项:

    –help, -h 显示帮助

    如果你想马上开始分享你一个以太坊教程,可以直接在线练习使用geth命令。

    发布在 编程 阅读更多
  • J
    jimi2018

    EthBox是汇智网为了方便以太坊开发学习者快速安装本地开发环境而制作的开发套件,可以一键安装以下必备开发工具:

    • nodejs:8.11.2
    • git:2.17.1.2
    • geth:1.8.10
    • ganache-cli:6.1.0
    • truffle:4.1.11

    EthBox即支持采用仿真器进行快速开发验证,也支持使用标准
    节点软件搭建私链测试,或接入公链进行部署。

    EthBox的当前版本是0.0.1,目前仅适用于windows操作系统。

    安装

    执行下载到本地的ethbox-setup.exe启动安装程序:

    agreement

    点击[接受]按钮,进入安装目录选择:

    installdir

    点击[安装]按钮,开始执行安装过程:

    install

    安装完毕后,在桌面可以看到EthBox图标:

    shortcut

    启动仿真器

    点击桌面的EthBox图标,即可进入EthBox环境:

    EthBox

    执行ganache-cli启动仿真器:

    C:\Users\user> ganache-cli
    

    显示如下结果,表示成功启动:

    ganache

    创建truffle项目

    再次点击桌面的EthBox图标,进入EthBox环境。

    创建一个项目目录,然后执行truffle unbox webpack初始化项目文件:

    C:\Users\user> md demo
    C:\Users\hubwiz\demo> truffle.cmd unbox webpack
    

    你将会看到如下结果:

    truffle unbox webpack

    Setting up...处将需要等待一会儿,因为需要从网络下载项目依赖包。

    运行truffle项目

    首先修改默认的truffle.js配置文件,将节点端口修改为8545 - 因为ganache-cli的监听端口是8545:

    module.exports = {
      networks:{
        development: {
          port: 8545
        }
      }
    }
    

    然后修改app/javascripts/app.js中的节点URL,同样将端口修改为8545:

    window.web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
    

    现在执行truffle compile命令编译合约:

    C:\Users\user\demo> truffle.cmd compile
    

    编译过程中有一些警告,暂时忽略即可。

    然后执行truffle migrate部署合约:

    C:\Users\user\demo> truffle.cmd migrate
    

    结果如下:

    truffle migrate

    在部署过程中,如果你切换到ganache那个窗口,会看到一些交易信息 —— 部署合约也是一种交易:

    ganache transactions

    一切就绪!可以启动web服务器了:

    C:\Users\user\demo> npm run dev
    

    这个命令会执行内存打包并且启动一个在8080端口监听的web服务器:

    npm-run-dev

    现在,访问 http://localhost:8080 即可!

    web

    注意这句话:

    You have 10000 META

    这个10000是从链上(ganache-cli)取来的,因此看到这个数字,就意味着,你的以太坊开发环境部署成功!

    原文:http://blog.hubwiz.com/2018/06/07/ethbox-readme/

    发布在 编程 阅读更多
  • J
    jimi2018

    本以太坊教程主要是介绍:搭建一个开发环境、编写编译一个智能合约。

    以太坊是什么

    以太坊(Ethereum)是一个开源的有智能合约功能的公共区块链平台。通过其专用加密货币以太币(Ether)提供去中心化的虚拟机(“以太虚拟机” Ethereum Virtual Machine)来处理点对点合约。

    以太坊的概念首次在2013至2014年间由程序员Vitalik Buterin,受比特币启发后提出,大意为“下一代加密货币与去中心化应用平台”,在2014年通过ICO众筹得以开始发展。目前以太币是市值第二高的加密货币,仅次于比特币。

    以太坊区块链是什么?

    以太坊区块链有 2 个主要组件:

    • 数据存储:网络中每笔交易都存储在区块链上。当你部署合约时,就是一笔交易。当你执行合约功能时,也是另一笔交易。所有的这些交易都是公开的,每个人都可以看到并进行验证。这个数据永远也无法篡改。为了确保网络中的所有节点都有着同一份数据拷贝,并且没有向区块链中写入任何的无效数据,以太坊使用一个叫做工作量证明的算法来保证网络安全。

    • 代码:就数据的层面而言,区块链就是存储交易。在以太坊的世界里,你可以通过一个叫 Solidity 的语言编写逻辑/应用代码(也就是智能合约)。然后用 solidity 编译器将代码编译为以太坊字节码,并将字节码部署到区块链上(也有一些其他的语言可以写合约,不过 solidity 是到目前为止用得最多也是相对更容易的选择)。所以,以太坊不仅仅会存储交易数据,它还会存储和执行智能合约代码。

    可以简单的理解以太坊区块链的作用就是存储数据和代码,并在 EVM(Ethereum Virtual Machine,以太坊虚拟机)中执行代码。

    要准备的基础知识

    为了进行以太坊开发,你应该对以下语言/技术有基本了解:

    • 熟悉某种面向对象语言(如Python,Java,go)
    • HTML/CSS/Javascript
    • 基本的命令行交互如Linux shell命令
    • 理解数据库的基本概念

    为了构建以太坊去中心化应用即Dapp(Decentralized application),以太坊有一个非常方便的 JavaScript 库即 web3.js,你也可以在一些 js 框架中直接引入该库构建应用,比如 react,angular,vue 等。

    示例:一个以太坊投票应用

    以太坊教程示例中,我们将会构建一个简单的去中心化投票应用。所谓去中心化应用,就是一个不只存在于某一中心化服务器上的应用。在网络中成百上千的电脑上,会运行着非常多的应用副本,这使得它几乎不可能出现宕机的情况。你将会构建一个投票应用,在这个应用中,你可以初始化参与选举的候选者,并对候选者投票,而这些投票将会被记录在区块链上。你将会经历编写投票合约,部署到区块链并与之交互的整个过程。你将会了解什么是一个合约,将合约部署到区块链上并与之交互意味着什么。

    本质上,区块链就像是一个分布式数据库,这个数据库维护了一个不断增长的记录链表。如果熟悉关系型数据库,你应该知道一张表里有很多行的数据。现在,对数据进行批(batch)量处理(比如每批 100 行),并将每个处理的批次相连。就可以形成一个区块链了!在区块链里,每个批次的数据就叫一个块(block),块里的每一行就叫一笔交易(transaction)。

    现在,你对以太坊已经有了基本了解,我们可以开始构建投票的 dapp 了。这将会加强你对以太坊的认识,并且初略了解以太坊的功能。

    以太坊开发环境搭建

    Linux

    示例是 Ubuntu 16.04 下的学习环境搭建,你只需要成功安装了 nodejs 和 npm,就可以继续项目的下一步了。

    我们通过 npm 安装 ganache 和 web3 包来为以太坊教程提供支撑。我们也需要安装 solc来编译合约。

    下面是安装过程:

    $ sudo apt-get update
    $ curl -sL https://deb.nodesource.com/setup_7.x -o nodesource_setup.sh
    $ sudo bash nodesource_setup.sh
    $ sudo apt-get install nodejs
    $ node --version
    v7.4.0
    $ npm --version
    4.0.5
    $ mkdir -p ethereum_voting_dapp/chapter1
    $ cd ethereum_voting_dapp/chapter1
    $ npm install ganache-cli [email protected] solc
    $ node_modules/.bin/ganache-cli
    

    如果安装成功,运行命令node_modules/.bin/ganache-cli,应该能够看到下面的输出。

    Ganache CLI v6.0.3 (ganache-core: 2.0.2)
    
    Available Accounts
    ==================
    (0) 0x5c252a0c0475f9711b56ab160a1999729eccce97
    (1) 0x353d310bed379b2d1df3b727645e200997016ba3
    (2) 0xa3ddc09b5e49d654a43e161cae3f865261cabd23
    (3) 0xa8a188c6d97ec8cf905cc1dd1cd318e887249ec5
    (4) 0xc0aa5f8b79db71335dacc7cd116f357d7ecd2798
    (5) 0xda695959ff85f0581ca924e549567390a0034058
    (6) 0xd4ee63452555a87048dcfe2a039208d113323790
    (7) 0xc60c8a7b752d38e35e0359e25a2e0f6692b10d14
    (8) 0xba7ec95286334e8634e89760fab8d2ec1226bf42
    (9) 0x208e02303fe29be3698732e92ca32b88d80a2d36
    
    Private Keys
    ==================
    (0) a6de9563d3db157ed9926a993559dc177be74a23fd88ff5776ff0505d21fed2b
    (1) 17f71d31360fbafbc90cad906723430e9694daed3c24e1e9e186b4e3ccf4d603
    (2) ad2b90ce116945c11eaf081f60976d5d1d52f721e659887fcebce5c81ee6ce99
    (3) 68e2288df55cbc3a13a2953508c8e0457e1e71cd8ae62f0c78c3a5c929f35430
    (4) 9753b05bd606e2ffc65a190420524f2efc8b16edb8489e734a607f589f0b67a8
    (5) 6e8e8c468cf75fd4de0406a1a32819036b9fa64163e8be5bb6f7914ac71251cc
    (6) c287c82e2040d271b9a4e071190715d40c0b861eb248d5a671874f3ca6d978a9
    (7) cec41ef9ccf6cb3007c759bf3fce8ca485239af1092065aa52b703fd04803c9d
    (8) c890580206f0bbea67542246d09ab4bef7eeaa22c3448dcb7253ac2414a5362a
    (9) eb8841a5ae34ff3f4248586e73fcb274a7f5dd2dc07b352d2c4b71132b3c73f0
    
    HD Wallet
    ==================
    Mnemonic:   cancel better shock lady capable main crunch alcohol derive alarm duck umbrella
    Base HD Path: m/44'/60'/0'/0/{account_index}
    
    Listening on localhost:8545
    

    为了便于测试,ganache 默认会创建 10 个账户,每个账户有 100 个以太。如果你还不懂什么是账户,把它想象成存钱的银行账户就可以了(以太(Ether,ETH)就是以太坊生态系统中的 钱/货币)。你需要用这个账户创建交易,发送/接收以太。

    MacOS

    如果你还没有安装 homebrew,请按照 https://brew.sh/ 的指示安装 homebrew。homebrew 是一个包管理器,它可以帮助我们安装开发所需的所有其他软件。按照下面的指示安装所有其他所需的包。

    $ brew update
    $ brew install nodejs
    $ node --version
    v7.10.0
    $ npm --version
    4.2.0
    $ mkdir -p ethereum_voting_dapp/chapter1
    $ cd ethereum_voting_dapp/chapter1
    $ npm install ganache-cli [email protected] solc
    $ node_modules/.bin/ganache-cli
    

    我们通过 npm 安装 ganache 和 web3 包。我们也需要安装 solc 来编译合约。

    如果安装成功,运行命令node_modules/.bin/ganache-cli,应该能够看到右图所示的输出。

    Ganache CLI v6.0.3 (ganache-core: 2.0.2)
    Available Accounts
    ==================
    (0) 0x5c252a0c0475f9711b56ab160a1999729eccce97
    (1) 0x353d310bed379b2d1df3b727645e200997016ba3
    (2) 0xa3ddc09b5e49d654a43e161cae3f865261cabd23
    (3) 0xa8a188c6d97ec8cf905cc1dd1cd318e887249ec5
    (4) 0xc0aa5f8b79db71335dacc7cd116f357d7ecd2798
    (5) 0xda695959ff85f0581ca924e549567390a0034058
    (6) 0xd4ee63452555a87048dcfe2a039208d113323790
    (7) 0xc60c8a7b752d38e35e0359e25a2e0f6692b10d14
    (8) 0xba7ec95286334e8634e89760fab8d2ec1226bf42
    (9) 0x208e02303fe29be3698732e92ca32b88d80a2d36
    
    Private Keys
    ==================
    (0) a6de9563d3db157ed9926a993559dc177be74a23fd88ff5776ff0505d21fed2b
    (1) 17f71d31360fbafbc90cad906723430e9694daed3c24e1e9e186b4e3ccf4d603
    (2) ad2b90ce116945c11eaf081f60976d5d1d52f721e659887fcebce5c81ee6ce99
    (3) 68e2288df55cbc3a13a2953508c8e0457e1e71cd8ae62f0c78c3a5c929f35430
    (4) 9753b05bd606e2ffc65a190420524f2efc8b16edb8489e734a607f589f0b67a8
    (5) 6e8e8c468cf75fd4de0406a1a32819036b9fa64163e8be5bb6f7914ac71251cc
    (6) c287c82e2040d271b9a4e071190715d40c0b861eb248d5a671874f3ca6d978a9
    (7) cec41ef9ccf6cb3007c759bf3fce8ca485239af1092065aa52b703fd04803c9d
    (8) c890580206f0bbea67542246d09ab4bef7eeaa22c3448dcb7253ac2414a5362a
    (9) eb8841a5ae34ff3f4248586e73fcb274a7f5dd2dc07b352d2c4b71132b3c73f0
    
    HD Wallet
    ==================
    Mnemonic:   cancel better shock lady capable main crunch alcohol derive alarm duck umbrella
    Base HD Path: m/44'/60'/0'/0/{account_index}
    
    Listening on localhost:8545
    

    为了便于测试,ganache 默认会创建 10 个账户,每个账户有 100 个以太。如果你还不懂什么是以太坊账户,把它想象成存钱的银行账户就可以了(以太(Ether, ETH)就是以太坊生态系统中的钱/货币)。你需要用这个账户创建交易,发送/接收以太。

    Windows

    • 安装 Visual Studio Community Edition。如果你选择定制安装,那么至少应该安装 Visual C++(目前的版本是 VS 2017)
    • 安装 Windows SDK for Windows
    • 安装 Python 2.7 如果你还没有安装的话,并且确保将它加入到环境变量 PATH
    • 安装 git 如果你还没有安装并加入到 PATH
    • 安装 OpenSSL。确保选择了正确的安装包,并且只安装完整版(而不是轻装版)。你必须将 OpenSSL 安装到推荐安装的位置 -- 不要改变安装路径
    • 下载和安装 node v8.1.2 。不推荐使用版本 v6.11.0 搭配 VS2017
    • 执行命令 npm install ganache-cli [email protected] solc

    Solidity Contracts

    现在已经安装好 ganache 并运行,我们将会开始编写第一个以太坊智能合约。

    我们会使用 solidity 编程语言来编写合约。如果你熟悉面向对象编程,学习用 solidity 写合约应该非常简单。我们会写一个叫做 Voting 的合约(可以把合约看成是面对对象编程语言的一个类),这个合约有以下内容:

    • 一个构造函数,用来初始化一些候选者。
    • 一个用来投票的方法(对投票数加 1)
    • 一个返回候选者所获得的总票数的方法

    当你把合约部署到区块链的时候,就会调用构造函数,并只调用一次。与 web 世界里每次部署代码都会覆盖旧代码不同,在区块链上部署的合约是不可改变的,也就是说,如果你更新合约并再次部署,旧的合约仍然会在区块链上存在,并且数据仍在。新的部署将会创建合约的一个新的实例。

    pragma solidity ^0.4.18;
    
    contract Voting {
    
      mapping (bytes32 => uint8) public votesReceived;
      bytes32[] public candidateList;
    
      function Voting(bytes32[] candidateNames) public {
        candidateList = candidateNames;
      }
    
      function totalVotesFor(bytes32 candidate) view public returns (uint8) {
        require(validCandidate(candidate));
        return votesReceived[candidate];
      }
    
      function voteForCandidate(bytes32 candidate) public {
        require(validCandidate(candidate));
        votesReceived[candidate]  += 1;
      }
    
      function validCandidate(bytes32 candidate) view public returns (bool) {
        for(uint i = 0; i < candidateList.length; i++) {
          if (candidateList[i] == candidate) {
            return true;
          }
        }
        return false;
       }
    }
    

    将右侧代码拷贝到一个叫做 Voting.sol 的文件中,并保存到 chapter1 目录下面。

    代码和解释

    • Line 1. 我们必须指定代码将会哪个版本的编译器进行编译
    • Line 3. mapping 相当于一个关联数组或者是字典,是一个键值对。mapping votesReceived 的键是候选者的名字,类型为 bytes32。mapping 的值是一个未赋值的整型,存储的是投票数。
    • Line 4. 在很多编程语言中,仅仅通过 votesReceived.keys 就可以获取所有的候选者姓名。但是,但是在 solidity 中没有这样的方法,所以我们必须单独管理一个候选者数组 candidateList。
    • Line 14. 注意到 votesReceived[key] 有一个默认值 0,所以你不需要将其初始化为 0,直接加1 即可。

    你也会注意到每个函数有个可见性说明符(visibility specifier)(比如本例中的 public)。这意味着,函数可以从合约外调用。如果你不想要其他任何人调用这个函数,你可以把它设置为私有(private)函数。如果你不指定可见性,编译器会抛出一个警告。最近 solidity 编译器进行了一些改进,如果用户忘记了对私有函数进行标记导致了外部可以调用私有函数,编译器会捕获这个问题。 这里 可以看到所有的可见性说明符。

    你也会在一些函数上看到一个修饰符 view。它通常用来告诉编译器函数是只读的(也就是说,调用该函数,区块链状态并不会更新)。所有的修饰符都可以在 这里 看到。

    编译智能合约

    我们将会使用上一节安装的 solc 库来编译代码。如果你还记得的话,之前我们提到过 web3js 是一个库,它能够让你通过 RPC 与区块链进行交互。我们将会在 node 控制台里用这个库部署合约,并与区块链进行交互。

    首先,在终端中运行 node 进入 node 控制台,初始化 web3 对象,并向区块链查询获取所有的账户。

    确保与此同时 ganache 已经在另一个窗口中运行

    为了编译合约,先从 Voting.sol 中加载代码并绑定到一个 string 类型的变量,然后像下边这样对合约进行编译。

    $ node
    
    In the node console
    > Web3 = require('web3')
    > web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
    > web3.eth.accounts
    ['0x5c252a0c0475f9711b56ab160a1999729eccce97'
    '0x353d310bed379b2d1df3b727645e200997016ba3'
    '0xa3ddc09b5e49d654a43e161cae3f865261cabd23'
    '0xa8a188c6d97ec8cf905cc1dd1cd318e887249ec5'
    '0xc0aa5f8b79db71335dacc7cd116f357d7ecd2798'
    '0xda695959ff85f0581ca924e549567390a0034058'
    '0xd4ee63452555a87048dcfe2a039208d113323790'
    '0xc60c8a7b752d38e35e0359e25a2e0f6692b10d14'
    '0xba7ec95286334e8634e89760fab8d2ec1226bf42'
    '0x208e02303fe29be3698732e92ca32b88d80a2d36']
    
    
    > code = fs.readFileSync('Voting.sol').toString()
    > solc = require('solc')
    > compiledCode = solc.compile(code)
    

    当你成功地编译好合约,打印 compiledCode 对象(直接在 node 控制台输入 compiledCode 就可以看到内容),你会注意到有两个重要的字段,它们很重要,你必须要理解:

    • 1.compiledCode.contracts[':Voting'].bytecode: 这就是 Voting.sol 编译好后的字节码。也是要部署到区块链上的代码。
    • 2.compiledCode.contracts[':Voting'].interface: 这是一个合约的接口或者说模板(叫做 abi 定义),它告诉了用户在这个合约里有哪些方法。在未来无论何时你想要跟任意一个合约进行交互,你都会需要这个 abi 定义。你可以在这里 看到 ABI 的更多内容。

    教程参考汇智网的DAPP开发入门教程,如果大家等不及博客更新,也可以直接访问这个以太坊教程

    发布在 编程 阅读更多
  • J
    jimi2018

    以太坊智能合约

    以太坊是一个分布式的计算平台。它会生成一个名为Ether的加密货币。程序员可以在以太坊区块链上写下“智能合约”,这些以太坊智能合约会根据代码自动执行。

    以太坊是什么?

    以太坊经常与比特币相提并论,但情况却有所不同。比特币是一种加密货币和分布式支付网络,允许比特币在用户之间转移。

    相关:什么是比特币?它是如何工作的?

    以太坊项目有更大的目标。正如Ethereum网站所说,“以太坊是一个运行智能合约的分布式平台”。这些智能合约运行在“以太坊虚拟机”上,这是一个由所有运行以太网节点的设备组成的分布式计算网络。

    “分布式平台”部分意味着任何人都可以建立并运行以太坊节点,就像任何人都可以运行比特币节点一样。任何想要在节点上运行“智能合约”的人都必须向Ether中的这些节点的运营商付款,这是一个与以太坊相关的加密货币。因此,运行以太网节点的人提供计算能力,并在以太网中获得支付,这与运行比特币节点的人提供哈希能力并以比特币支付的方式类似。

    换句话说,虽然比特币仅仅是一个区块链和支付网络,但以太坊是一个分布式计算网络,其区块链可以用于许多其他事情。以太坊白皮书中提供了详细信息。

    以太是什么?

    以太网是与以太坊区块链相关的数字标记(或者说就是加密货币)。换句话说,以太是代币,以太坊是平台。但是,现在人们经常交替使用这些术语。例如,Coinbase允许你购买以太坊代币(Ethereum),即代表以太币代币。

    这在技术上就是“altcoin”,这实际上意味着一个非比特币加密货币。和比特币一样,Ether也受到分布式区块链支持 - 在这种情况下是以太坊区块链。

    想要在以太坊区块链上创建应用程序或以太坊 智能合约的开发人员需要以太网代币来支付节点来托管它,而基于以太坊的应用程序的用户可能需要以太网来支付这些应用程序中的服务费用。人们也可以在以太坊网络之外销售服务,并接受以太网支付,或者可以在交易所以现金形式出售以太币代币 - 就像比特币一样。

    为什么分布式应用程序有趣?

    以太坊区块链应用程序

    比特币区块链存储比特币交易的历史,就是这样。以太坊区块链将以太币代币存储在人们的钱包中,但它还存储每个智能合约的最新状态以及每个智能合约的代码。

    区块链是存储在多个位置的分布式账本,所以这意味着智能合约数据由那些以太坊节点存储。如果您在区块链上创建“智能合约”(也称为应用程序),则会以分布式的方式进行存储和运行。

    为了比较,请考虑我们今天使用的许多应用程序。这包括Gmail等电子邮件应用程序,Microsoft OneNote等笔记记录应用程序,以及使用应用程序并将数据存储在公司服务器上的任何其他应用程序。如果存储数据的公司禁止您的帐户,关闭应用程序或停业,那么除非您有脱机备份副本,否则您将丢失该应用程序中的所有数据。

    如果您使用的是构建在以太坊之上的应用程序,组成应用程序的代码(智能合约代码)和个人数据(智能合约的状态)将存储在区块链中。每当您使用应用程序并更改数据时,所有以太坊节点都会更新智能合约的状态。这意味着没有中央“失败点”可能会阻止您访问数据或关闭您使用的应用程序。您的数据和应用程序的代码本身将在全球范围内备份,并且没有人可以将所有这些备忘录脱机。当然,您的数据将通过区块链进行加密,所以没有其他人可以读取它。

    什么是智能合约?

    智能合约是在以太坊虚拟机上运行的应用程序。这是一个分布的“世界计算机”,计算能力由所有以太坊节点提供。提供计算能力的任何节点都将以Ether数字货币作为资源支付。

    他们被命名为智能合约,因为您可以编写满足要求时自动执行的“合同”。

    例如,想象一下在以太坊之上建立一个类似Kickstarter的众筹服务。有人可以建立一个以太坊智能合约,将资金汇集到别人身上。这个智能合约可以写成这样的话:当将100,000美元的货币添加到池中时,它将全部发送给收件人。或者,如果一个月内没有达到100,000美元的门槛,所有的货币都将被发回给货币的原始持有人。当然,这将使用以太币代替美元。

    这一切都将根据智能合同代码进行,智能合同代码可自动执行交易,而无需可信任的第三方持有货币并签署交易。例如,Kickstarter在5%的付款处理费之上收取5%的费用,这意味着在$ 100,000的众筹项目中将收取8000到10000美元的费用。智能合约不需要向像Kickstarter这样的第三方支付费用。

    智能合约可以用于许多不同的事情。开发人员可以创建智能合约,为其他智能合约提供功能,类似于软件库的工作方式。或者,智能合约可以简单地用作应用程序来存储以太坊区块链上的信息。

    为了真正执行智能合同代码,有人必须发送足够的以太网代币作为交易费 - 多少取决于所需的计算资源。这为以太坊节点参与并提供计算能力付出了代价。

    CryptoKitties使用智能合约

    CryptoKitties 智能合约

    在以太坊网络上使用智能合约构建的最知名的应用之一是CryptoKitties,它自称是“世界上第一款基于区块链技术构建的游戏”。

    从本质上讲,CryptoKitties是存储在以太坊区块链中的一种数字“可收集”形式。 CryptoKitties提供了在Ethereum网络上存储和交换数字项目的能力的良好演示。

    新的CryptoKitties是通过“繁殖”生成的。这涉及到选择两个基本的CryptoKitties并花费以太币代币运行智能合约。合约使用两只选择的猫来产生新的CryptoKitty。这些小猫和繁殖过程的细节存储在以太坊区块链的公共账本上。

    您可以“拥有”CryptoKitties,它们存储在以太坊区块链分类账中。您可以将其出售或交易给其他人,也可以购买。这与使用允许您购买,交易和养殖猫的智能手机应用程序不同。这些通常会存储在应用程序自己的服务器上,如果公司关闭应用程序或禁止您的帐户,则可能会丢失珍贵的数字宠物。但是,因为CryptoKitties存储在区块链中,所以不会发生。没有人能把你的小猫带走。

    2017年12月 - 巧合的是,在比特币的历史最高价格附近,人们花费了超过1200万美元的CryptoKitties的Ether费用,而最昂贵的CryptoKitty售价约为12万美元。

    像以太网,比特币和昂贵的绘画一样,CryptoKitties值得人们准备为它们付钱。

    原文:howtogeek.com/350322/what-is-ethereum-and-what-are-smart-contracts
    作者: Chris Hoffman

    发布在 编程 阅读更多
  • J
    jimi2018

    智能合约开发是以太坊开发的核心,而代币合约的编写是智能合约开发的核心,用solidity开发一个代币合约的例子是学习以太坊开发智能合约时必须掌握的。

    以太坊的应用被称为去中心化应用(DApp),DApp的开发主要包括两大部分:

    • 智能合约的开发
    • 用户界面的开发
      在本文中,我们将介绍智能合约的开发语言solidity。

    让我们先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节。

    contract SimpleStorage {
        uint storedData;
    
        function set(uint x) {
            storedData = x;
        }
    
        function get() constant returns (uint retVal) {
            return storedData;
        }
    }
    

    在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成。合约位于以太坊区块链上的一个特殊地址。

    uint storedData; 这行代码声明了一个状态变量,变量名为storedData,类型为 uint (256bits无符号整数)。你可以认为它就像数据库里面的一个存储单元,跟管理数据库一样,可以通过调用函数查询和修改它。在以太坊中,通常只有合约的拥有者才能这样做。在这个例子中,函数 set 和 get 分别用于修改和查询变量的值。

    跟很多其他语言一样,访问状态变量时,不需要在前面增加 this. 这样的前缀。

    这个合约还无法做很多事情(受限于以太坊的基础设施),仅仅是允许任何人储存一个数字。而且世界上任何一个人都可以来存取这个数字,缺少一个(可靠的)方式来保护你发布的数字。任何人都可以调用set方法设置一个不同的数字覆盖你发布的数字。但是你的数字将会留存在区块链的历史上。稍后我们会学习如何增加一个存取限制,使得只有你才能修改这个数字。

    编写代币合约

    接下来的合约将实现一个形式最简单的加密货币。任何人都可以发送货币给其他人,不需要注册用户名和密码,只要有一对以太坊的公私钥即可。

    contract Coin {
    //关键字“public”使变量能从合约外部访问。
        address public minter;
        mapping (address => uint) public balances;
    
    //事件让轻客户端能高效的对变化做出反应。
        event Sent(address from, address to, uint amount);
    
    //这个构造函数的代码仅仅只在合约创建的时候被运行。
        function Coin() {
            minter = msg.sender;
        }
        function mint(address receiver, uint amount) {
            if (msg.sender != minter) return;
            balances[receiver] += amount;
        }
        function send(address receiver, uint amount) {
            if (balances[msg.sender] < amount) return;
            balances[msg.sender] -= amount;
            balances[receiver] += amount;
            Sent(msg.sender, receiver, amount);
        }
    }
    

    这个合约引入了一些新的概念,让我们来逐个介绍。

    address public minter;`
    

    这行代码声明了一个可公开访问的状态变量,类型为address。address类型的值大小为160 bits,不支持任何算术操作。适用于存储合约的地址或其他人的公私钥。public关键字会自动为其修饰的状态变量生成访问函数。没有public关键字的变量将无法被其他合约访问。另外只有本合约内的代码才能写入。自动生成的函数如下:

    function minter() returns (address) { return minter; }
    

    当然我们自己增加一个这样的访问函数是行不通的。编译器会报错,指出这个函数与一个状态变量重名。

    下一行代码创建了一个public的状态变量,但是其类型更加复杂:

    mapping (address => uint) public balances; 
    

    该类型将一些address映射到无符号整数。mapping可以被认为是一个哈希表,每一个可能的key对应的value被虚拟的初始化为全0.这个类比不是很严谨,对于一个mapping,无法获取一个包含其所有key或者value的链表。所以我们得自己记着添加了哪些东西到mapping中。更好的方式是维护一个这样的链表,或者使用其他更高级的数据类型。或者只在不受这个缺陷影响的场景中使用mapping,就像这个例子。在这个例子中由public关键字生成的访问函数将会更加复杂,其代码大致如下:

    function balances(address _account) returns (uint balance) {
        return balances[_account];
    }
    

    我们可以很方便的通过这个函数查询某个特定账号的余额。

    event Sent(address from, address to, uint value); 
    

    这行代码声明了一个“事件”。由send函数的最后一行代码触发。客户端(服务端应用也适用)可以以很低的开销来监听这些由区块链触发的事件。事件触发时,监听者会同时接收到from,to,value这些参数值,可以方便的用于跟踪交易。为了监听这个事件,你可以使用如下代码:

    Coin.Sent().watch({}, '', function(error, result) {
        if (!error) {
            console.log("Coin transfer: " + result.args.amount +
                " coins were sent from " + result.args.from +
                " to " + result.args.to + ".");
            console.log("Balances now:\n" +
                "Sender: " + Coin.balances.call(result.args.from) +
                "Receiver: " + Coin.balances.call(result.args.to));
        }
    }
    

    注意在客户端中是如何调用自动生成的 balances 函数的。

    这里有个比较特殊的函数 Coin。它是一个构造函数,会在合约创建的时候运行,之后就无法被调用。它会永久得存储合约创建者的地址。msg(以及tx和block)是一个神奇的全局变量,它包含了一些可以被合约代码访问的属于区块链的属性。msg.sender 总是存放着当前函数的外部调用者的地址。

    最后,真正被用户或者其他合约调用,用来完成本合约功能的函数是mint和send。如果合约创建者之外的其他人调用mint,什么都不会发生。而send可以被任何人(拥有一定数量的代币)调用,发送一些币给其他人。注意,当你通过该合约发送一些代币到某个地址,在区块链浏览器中查询该地址将什么也看不到。因为发送代币导致的余额变化只存储在该代币合约的数据存储中。通过事件我们可以很容易创建一个可以追踪你的新币交易和余额的“区块链浏览器”。

    分享两个教程和一些免费资料给读者:

    一个适合区块链新手的以太坊DApp开发教程:

    http://xc.hubwiz.com/course/5a952991adb3847553d205d1

    一个用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台:

    http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6

    收集整理了一些免费区块链、以太坊技术开发相关的文件,有需要的可以下载,文件链接:

    1. web3.js API官方文档中文版:https://pan.baidu.com/s/1hOV9hEzi7hFxJCL4LTvC6g
    2. 以太坊官方文档中文版     :https://pan.baidu.com/s/1ktODJKLMBmkOsi8MPrpIJA
    3. 以太坊白皮书中文版       :https://pan.baidu.com/s/1bzAFnzJ35hlQxJ2J4Oj-Ow
    4. Solidity的官方文档中文版 :https://pan.baidu.com/s/18yp9XjEqAHpiFm2ZSCygHw
    5. Truffle的官方文档中文版  :https://pan.baidu.com/s/1y6SVd7lSLUHK21YF5FzIUQ
    6. C#区块链编程指南         :https://pan.baidu.com/s/1sJPLqp1eQqkG7jmxqwn3EA
    7. 区块链技术指南          :https://pan.baidu.com/s/13cJxAa80I6iMCczA04CZhg
    8. 精通比特币中文版        :https://pan.baidu.com/s/1lz6te3wcQuNJm28rFvBfxg
    9. Node.js区块链开发        :https://pan.baidu.com/s/1Ldpn0DvJ5LgLqwix6eWgyg
    10. geth使用指南文档中文版   :https://pan.baidu.com/s/1M0WxhmumF_fRqzt_cegnag
    11. 以太坊DApp开发环境搭建-Ubuntu   : https://pan.baidu.com/s/10qL4q-uKooMehv9X2R1qSA
    12. 以太坊DApp开发环境搭建-windows  :https://pan.baidu.com/s/1cyYkhIJIFuI2oyxM9Ut0eA
    13. 以太坊DApp开发私链搭建-Ubuntu   : https://pan.baidu.com/s/1aBOFZT2bCjD2o0EILBWs-g
    14. 以太坊DApp开发私链搭建-windows  :https://pan.baidu.com/s/10Y6F1cqUltZNN99aJv9kAA

    发布在 编程 阅读更多
  • J
    jimi2018

    有兴趣的技术人员可以加qq群:693422199

    发布在 编程 阅读更多
  • J
    jimi2018

    新整理的资料:

    1. Node.js区块链开发 :https://pan.baidu.com/s/1Ldpn0DvJ5LgLqwix6eWgyg
    2. geth使用指南文档中文版 :https://pan.baidu.com/s/1M0WxhmumF_fRqzt_cegnag
    3. 以太坊DApp开发环境搭建-Ubuntu : https://pan.baidu.com/s/10qL4q-uKooMehv9X2R1qSA
    4. 以太坊DApp开发环境搭建-windows :https://pan.baidu.com/s/1cyYkhIJIFuI2oyxM9Ut0eA
    5. 以太坊DApp开发私链搭建-Ubuntu : https://pan.baidu.com/s/1aBOFZT2bCjD2o0EILBWs-g
    6. 以太坊DApp开发私链搭建-windows :https://pan.baidu.com/s/10Y6F1cqUltZNN99aJv9kAA

    发布在 编程 阅读更多
  • J
    jimi2018

    谢谢点赞的同学。@river

    发布在 编程 阅读更多

与 V2MM 的连接断开,我们正在尝试重连,请耐心等待