工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表2016年12月的文章

账户、交易核心概念及投注合约解析

 

外部账户 vs 合约账户

以太坊中有两种类型的账户

  • 外部账户
  • 合约账户

它们的区别在Serenity版本中可能会消失。

外部账户(EOA)

外部账户

  • 有以太币余额,
  • 可以发送交易(以太币交易或引发合约代码),
  • 由私钥控制,
  • 没有相关代码。

合约账户

合约

  • 有以太币余额,
  • 有相关代码,
  • 代码执行由从其他合约接收的交易或消息(调用)触发,
  • 执行的时候—执行任意复杂的操作(图灵完备的)—操控它自己的永久存储,例如,可以有自己的持久状态—可以调用其他合约

以太坊区块链上的所有行为都由外部账户引发的交易调动。每次合约账户接收到交易时,它的代码都按照输入参数的指示执行,作为交易的一部分发送。合约代码由参与到网络的每个节点上的以太坊虚拟机执行,作为验证新区块的一部分。

这个执行需要是完全确定性的,它唯一的语境是区块链上区块的位置和所有可见的数据。区块链上的区块代表时间单位,区块链本身是时间维度,代表在链上区块指定的离散的时间点上状态的整个历史。

所有的以太币余额和价值都以wei为单位命名:1个以太币是1e18 wei。

注意:以太坊中的“合约”不应该被看做是要“实现”或“遵守”的事物;它更像是在以太坊执行环境中生存的“自治代理”,被消息或交易“戳到”的时候,总会执行特定的代码片段,并且对自己的以太币余额和钥匙/价值商店有直接的控制,以储存永久状态。

什么是交易?

“交易”这个术语用在以太坊中来指代签署的数据包,数据包存储着要从外部账户发送到区块链上另一账户的消息。

交易包括:

  • 消息接收人,
  • 一个签字,用以确认发送方身份,证明通过区块链向接收者发送消息的意图,
  • VALUE域—从发送方向接收方转移的wei的数量,
  • 可选数据域,包括发送到合约的消息,
  • 一个STARTGAS值,代表交易执行允许采取的运算步骤的最大数量,
  • 一个GASPRICE值,代表发送人愿意支付的gas费用。一个gas单位对应着一个原子指令执行,比如运算步骤。

什么是消息?

合约能够向其他合约发送“消息”。消息是虚拟的事物,永远不能序列化,只存在于以太坊执行环境中。他们可以被想象为功能调用。

消息包括:

  • 消息发送方(内含的)
  • 消息接收方
  • VALUE域—和发送到合约地址的消息一起转移的wei数量,
  • 可选数据域,即发送到合约的实际数据
  • 一个STARTGAS值,限制了消息可以触发的代码执行的gas最大值。

本质上来说,一个消息就像一个交易,只不过消息是由合约而不是由外在因素创造的。当正在执行代码的合约执行CALL或DELEGATECALL 操作码时,消息就产生了。和交易一样,消息可能会导致接收方账户运行代码。因此,就像和外在因素建立关系一样,合约也能以同样的方式和其他合约建立关系。

什么是gas?

以太坊虚拟机(EVM)是以太坊区块链上的可执行环境。 每个参与到网络的节点运行EVM,作为区块验证协议的一部分。他们检查列在区块上的、他们验证的交易,运行EVM内部交易触发的代码。每个网络上的完整节点进行同样的运算,储存相同的值。很明显以太坊并不是关于运算效率的优化。它类似的进程是多余的。它的目的是提供一个有效的方式,在系统状态上不需要信任的第三方、准则或暴力垄断就能达成共识。但重要的是他们不是为了优化运算而存在。事实上,合约执行在节点之间被多余地重复,自然使之更昂贵,通常会鼓励人们如果能在链外操作运算,就不在区块链里进行。

运行去中心化应用(dapp)时,它和区块链互动来阅读和修正状态,但是去中心化应用会很典型地只把业务逻辑和对共识至关重要的状态放在区块链上。

当消息或交易触发结果执行时,每个指令在每个网络节点被执行。这有一个代价:每个执行的操作都有特定的成本,以一定量的gas单元表现。

Gas是交易发送方需要为每个以太坊区块链上发生的操作所支付的执行花费。这个名字gas的灵感来自这样一个观点,这笔花费就像加密燃料,驱使智能合约产生。Gas从执行代码的矿工处购买以获得以太币。Gas和以太币被故意分开,因为gas单位与具备自然成本的运算单位一致,而以太币的价格通常会由于市场力量产生波动。二者由自由市场调和:gas价格实际上由矿工决定,矿工可以拒绝以低于最低限度的gas价格进行交易。为了获得gas,你只需要向账户中添加以太币。以太坊客户端会自动为你的以太币购买gas,数量是你指定的交易最大支出。

在合约或交易执行的每个运算步骤,以太坊协议都要收费,以防止以太坊网络上发生蓄意攻击或滥用。每个交易都必须包含一个gas限度和每gas愿意支付的花费。矿工可以选择是否将交易包括在内和收集花费。如果交易产生的、用于运算步骤的gas总量,包括原始消息和可能引发的子消息,少于或等于gas限额,那么交易就会进行。如果gas总量超过gas限额,那么所有的变化都复原,但是交易仍然有效,矿工仍然可以收集花费。未用于交易执行的、所有多余的gas都会以以太币的形式偿还给发送方。不必担心超支,因为只会对你消费的gas收费。这意味着以高于预估的gas限额发送交易也是有效和安全的。

估算交易成本

交易花费的以太币总量基于两个因素:

gasUsed 是交易消费的gas总量

gasPrice 交易中指定的一个gas单元的价格(换算成以太币)

总成本= gasUsed * gasPrice

gasUsed

以太坊虚拟机上的每个操作都会被指派消费的gas数量。gasUsed是所有执行的操作所需的gas总额。有个电子表格可以看到背后的一些统计。

对于估算gasUsed,可以用estimate Gas API但是有些警告说明。

gasPrice

用户建构并签署交易,每个用户可以说明自己想要的gasPrice,可以是零。然而Frontier发布的以太坊客户端默认gasPrice是0.05e12 wei。由于矿工会使收入最优化,如果大部分交易都以0.05e12 wei 的gasPrice提交,就很难说服矿工接受价格更低或为0的交易。

示例交易成本

我们来做一个只添加2个数字的合约。EVM OPCODE ADD消费3 gas。

大概的成本,以默认gas价格计算 (2016年1月)是:

3 * 0.05e12 = 1.5e11 wei

1以太币是1e18 wei,总成本就是0.00000015以太币。

这是个简化的计算,因为忽略了一些成本,比如将2个数字转移给合约的成本,在他们可以被添加之前。

  • question
  • gas费用
  • gas成本计算器
  • 以太坊Gas价格

账户交互示例 — 投注合约

之前提到过,有两种类型的账户:

  • 外部账户 (EOA):由私钥控制的账户,如果你有和外部账户相关的私钥,就能从账户发送以太币和消息。
  • 合约: 有自己代码的账户,受代码控制。

以太坊默认的执行环境是没有生命的,什么都不会发生,每个账户的状态保持相同。但是,每个用户都可以通过从外部账户发送交易来触发行动,启动以太坊。如果交易的目的地是其他外部账户,交易可能会转移一些以太币,否则什么也不会做。但如果目的地是个合约, 反之合约会激活,自动运行代码。

代码有能力读/写自己的内部存储(一个将32字节钥匙映射到32字节价值的数据库),阅读存储的接收消息,给其他合约发送消息,转而触发执行。一旦执行停止,合约发送的消息所触发的所有的子执行都会停止(这些都以决定好的同步的顺序发生,比如,子调用在父调用进一步之前完全完成),执行环境立即再次停止,直到被下一个交易唤醒。

合约通常服务于四个目的:

  • 保持数据库代表着对其他合约或外部世界有用的东西;一个例子是合约激励货币,另一个例子是合约在特定的组织里记录会员。
  • 作为某种具有更复杂访问政策的外部账户,被称为“前向合约”,典型地只在特定条件下,把进来的消息转发给到指定目的地;例如,前向合约可能会等到指定3个私钥中的2个都确认了特定的消息之后才会进行转发(例如,多重签名)。更复杂的前向合约基于要发送的消息会有不同的条件。最简单的一个功能使用案例就是撤回限制,在一些更复杂的访问政策中难以驾驭。钱包合约就是个很好的例子。
  • 在多个用户之间管理一个正在进行的合约或关系。例子包括金融合约,有特定中介的第三方保管合约,或一些保险。也可以是开放合约,一方对其他方的随时参与保持开放;一个例子是自动给提交数学问题有效解决方案或是证明提供了一些运算资源的人发奖金的合约。
  • 给其他合约提供功能,本质上作为软件库。 合约通过被交替叫做“调用”或“发送消息”的活动进行互动。“消息”是包含一定量以太币,任何大小的数据字节串,发送方和接收方地址的事物。合约接收消息时,可以选择返还一些数据,消息本来的发送方可以立即使用。 这样发送消息就和调用一个功能一样。

因为合约有这样的作用,我们期望合约可以彼此互动。举个例子,设想一个情景,Alice和Bob赌100 Gav币,明年旧金山的温度不会超过35ºC。但是Alice非常有安全意识,她的第一个账户使用的前向合约,只有在3个私钥中的2个都批准的情况下才可以发送消息。Bob偏执于量子加密图形,他使用的前向合约,只传递有Lamport签名和传统ECDSA的消息(但是因为他很老派,所以更偏向于用基于SHA256的Lamport签名版本,以太坊不直接支持)。

投注合约本身需要从一些合约中取得旧金山天气的数据,当它想要实际发送Gav币给Alice或Bob时,也需要和Gav币合约交谈(或者,更准确地说,Alice或Bob的前向合约)。因次我们可以这样表示账户之间的关系:

Bob 想最终决定赌注的时候,就会发生以下的步骤:

  1. 交易被发出,触发消息从Bob的外部账户发送到他的前向合约。
  2. Bob的前向合约给合约发送消息散表和Lamport签名,发挥Lamport签名确认库的作用。
  3. Lamport签名确认库看到Bob想要基于SHA256的Lamport签名,于是给SHA256库多次发调用来确认签名。
  4. Lamport签名确认库一旦回到1,表明签名已确认,他就会给代表赌注的合约发送消息。
  5. 赌注合约检查提供旧金山天气的合约,查看天气如何。
  6. 赌注合约看到对消息的回应显示天气高于35ºC,就会给Gav币合约发送消息,将Gav币从它的账户转移到Bob的前向合约。

注意Gav币在Gav币合约的数据库中作为一个整体“储存”;第6步语境中“账户”的意思只是说在Gav币合约储存中有数据入口,有钥匙可以进入赌注合约的地址和余额值。接收到消息后,Gav币合约值上减少,与Bob前向账户对应的入口值增加。 我们可以在下表看到这些步骤:

离线签署交易

[可以把这一部分加到常见问题,指向turb以太坊向导的ethkey章节]

  • Resilience Raw Transaction Broadcaster

如何使用CPU挖矿?

 

CPU挖掘

你可以用电脑的中央处理器(CPU)挖以太币。自从GPU矿工的效率高出两个数量级,它就不再盈利了。然而你可以用CPU挖掘在Morden测试网或私有链上挖矿,以便创建你测试合约和交易所需要的以太币, 而无需花费实时网络上的真实以太币。

注意:测试网以太币除了用于测试目的外没有其他价值(查看测试网络)。

使用geth

用geth启动以太坊节点时,并不是默认挖掘。在CPU挖掘模式开启,你会用—mine命令行选项。-minerthreads参数可以用于设置平行于挖掘线程的数量(默认为处理器核心的总数)。

1
geth --mine --minerthreads=4

你也可以在执行期间用控制台开启或停止CPU挖掘。miner.start取一个矿工线程数量的可选参数。

1 2 3 4
> miner.start(8) true > miner.stop() true

 

注意挖掘真实以太币只有在你与网络同步时才有意义(由于你是在共识区块顶部挖矿)。因此以太区块链下载器/同步器会延迟挖掘直到同步完成,此后挖掘自动开始,除非你用miner.stop()取消挖矿。

为了赚取以太币,你必须有etherbase(或coinbase)地址集。这个etherbase默认为你的第一个账户。如果你没有etherbase地址,geth –mine就不会开启。

你可以在命令行重新设置etherbase:

1 2
geth --etherbase 1 --mine 2>> geth.log // 1 is index: second account by creation order OR geth --etherbase '0xa4d8e9cae4d04b093aac82e6cd355b6b963fb7ff' --mine 2>> geth.log

你也可以在控制台重新设置etherbase:

1
miner.setEtherbase(eth.accounts[2])

注意你的etherbase不必是本地账户地址,只要是现存的就可以。

有一个给你挖掘过的区块添加额外数据的选项(只有32字节)。按照惯例,它被解释为统一码字符串,你可以设置短期虚荣标签。

1 2 3 4 5 6 7 8 9 10 11 12 13
miner.setExtra("ΞTHΞSPHΞΞ") ... debug.printBlock(131805) BLOCK(be465b020fdbedc4063756f0912b5a89bbb4735bd1d1df84363e05ade0195cb1): Size: 531.00 B TD: 643485290485 { NoNonce: ee48752c3a0bfe3d85339451a5f3f411c21c8170353e450985e1faab0a9ac4cc Header: [ ...   Coinbase: a4d8e9cae4d04b093aac82e6cd355b6b963fb7ff   Number: 131805   Extra: ΞTHΞSPHΞΞ ... }

你可以用miner.hashrate检查散表率,结果用H/s表示(每秒散表操作)。

1 2
> miner.hashrate 712000

成功挖掘一些区块以后,你可以检查etherbase账户中的以太币余额。现在假定你的etherbase是个本地账户:

1 2
> eth.getBalance(eth.coinbase).toNumber(); '34698870000000'

为了花费你赚的gas来交易,你需要解锁账户。

1 2 3
> personal.unlockAccount(eth.coinbase) Password true

你可以在控制台上用以下代码片段,检查哪个区块被特殊的矿工(地址)挖掘过:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
function minedBlocks(lastn, addr) {   addrs = [];   if (!addr) {     addr = eth.coinbase   }   limit = eth.blockNumber - lastn   for (i = eth.blockNumber; i >= limit; i--) {     if (eth.getBlock(i).miner == addr) {     addrs.push(i)     }   }   return addrs } // scans the last 1000 blocks and returns the blocknumbers of blocks mined by your coinbase // (more precisely blocks the mining reward for which is sent to your coinbase). minedBlocks(1000, eth.coinbase); //[352708, 352655, 352559]

请注意,发现一个区块但是不能把它变成典型链会经常发生。这意味着你在当地把挖过的区块包括在内,当前的状态会显示归于你账户的挖矿奖励,然而不久后,会发现更好的链,我们转换到不包含你区块的链,因而不会记入任何挖矿奖励。因此很有可能矿工监控coinbase余额的时候会发现,它发生了相当程度的浮动。

Hyperledger fabric中的几个重要的角色

 Application Backend

存在的目的:
    后端应用程序服务支持应用程序关联到移动设备或者浏览器
关键角色:
    1)通过成员服务管理末端使用者和注册者
    2)启动交易请求,发送请求到末端
Owned by
    Solution provider, Network Proprietor

 

NVP节点

存在的目的:
    构建交易并且将它们发送到VP节点,peer节点保存了一份所有交易的副本以便于solution providers能够在本地查询它们
关键角色:
    1.管理或者维护通过成员服务发行的用户证书
    2.构建交易并且将交易转发到VP节点
    3.维护一个本地账本,允许application owner查询当地的信息
Owned by:
    Solution Provider, Network Auditor

VP节点
存在的目的:
    创建并且确认交易事物,并且维护chaincode的状态
关键角色:
    1)管理并且维护被成员服务发布的用户证书
    2)创建交易
    3)在区块链网络上和其他VP节点一起执行交易
    4)维护本地账本副本
    5)参与共识并且更新账本
Owned by:
    Network proprietor, Solution provider

membership(在未来的1.0版本中将变成cop)
存在的目的:
    末端用户或者组织的身份发行与管理
关键角色:
    1)发行登记证书给各个末端使用者或者组织
    2)发行交易证书到关联的各个末端使用者
    3)发行TSL证书确保在HyperLedger Fabric之间通信
    4)发行链特别的Key
Owned by: Third Party service provider

注:目前我们使用的HyperLedger fabric是0.6版本,与将要发布的1.0版本相比较,Fabric有以下变动:
1)HyperLedger Fabric v1.0 membersrvc模块将独立出来成为新的COP模块。
    COP将为Hyperledger fabric提供一个类似警方的安全功能
    COP的代码将比membership servicev0.6版本更短更简单
2)HyperLedger Fabric v1.0将更具有安全性和扩展性,COP的独立出来将更使基于HyperLedger Fabric改造更简单。
3)交易加密方面也将比v0.6版本加强很多,例如供应链, FOREX market, 健康医疗方面交易更加安全

Hyperledger fabric配置node.js

 一、配置Swagger-UI

1.你可以使用本地的node.js服务来运行rest-api,确保你本机已经安转node.js,如果没有安装,请安转一个
2.命令行下安转node.js
------npm install http-server -g
3.在你本机上启动http-server运行rest-api
------cd /opt/gopath/src/github.com/hyperledger/fabric/core/rest
-------http-server -a 0.0.0.0 -p 5554 --cors
4.浏览器中输入下面语句,确保能成功连接
------http://localhost:5554/rest_api.json
5.使用命令行下载 Swagger-UI包
------git clone https://github.com/swagger-api/swagger-ui.git
6.到 /swagger-ui/dist 下用浏览器打开index.html
7.启动没有连接到leader or validator的peer节点
----cd /opt/gopath/src/github.com/hyperledger/fabric
-----build/bin/peer node start
8.测试
----cd /opt/gopath/src/github.com/hyperledger/fabric/core/rest
----go test -v -run TestServerOpenchain_API_GetBlockCount

 

二、Node.Js应用程序
构建并且安装 fabric core.
    cd /opt/gopath/src/github.com/hyperledger/fabric
    make peer
在本地仅仅运行一个节点 (不是一个完整的网络) :
    build/bin/peer node start
配置一个测试区块链数据结构通过vagrant来运行测试接下来重启peer进程.
    cd /opt/gopath/src/github.com/hyperledger/fabric/core/rest
    go test -v -run TestServerOpenchain_API_GetBlockCount
在本地电脑上启动http-server来运行rest_api.json服务.
    npm install http-server -g
    cd /opt/gopath/src/github.com/hyperledger/fabric/core/rest
    http-server -a 0.0.0.0 -p 5554 --cors
下载和解压 Sample_1.zip
    unzip Sample_1.zip -d Sample_1
    cd Sample_1
如果没有默认的URL地址就在openchain.js文件中更新api_url变量以搭配合适的URL
    Update the api_url variable within openchain.js to the appropriate URL if it is not already the default
    var api_url = 'http://localhost:5554/rest_api.json';
运行Node.js app
    node ./openchain.js

ubuntu下搭建HyperLedger fabric开发环境

 一、安装docker
1、docker要求Linux内核版本不低于 3.10
>>检查Linux的内核版本,如果内核版本太低,升级内核
>>查看内核的版本命令uname -a
2、根据不同的Ubuntu版本安装docker
>>查看Ubuntu版本命令lsb_release -a
3、对于16.04的Ubuntu版本安装
>>sudo apt-get install docker-engine
4、启动
>>sudo systemctl enable docker
>>sudo systemctl start docker

二、从docker上拉取镜像
1、检验docker是否安装好
>>docker 
2、从docker上拉镜像
>>docker pull hyperledger/fabric-peer:latest
>>docker pull hyperledger/fabric-membersrvc:latest
3、校验镜像是否拉取完成
>>docker images

三、安装docker-compose项目
1、安装pip工具
>>pip工具会依赖Python,而Ubuntu下默认已经安转好Python2.7
>>apt-get install python_pip
2、安转docker compose项目
>>sudo pip install -U docker-compose
3、校验docker compose是否安装好
>> docker-compose -h

四、安装并配置nsenter工具
方法一、
 >>wget https://www.kernel.org/pub/linux/utils/util-linux/v2.29/util-linux-2.29.tar.xz; tar xJvf util-linux-2.29.tar.xz
>>cd util-linux-2.29
>> ./configure --without-ncurses && make nsenter
>>sudo cp nsenter /usr/local/bin
方法二、建议下载 .bashrc_docker,并将内容放到 .bashrc 中
>>wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
>>echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc

五、启动节点

1、在root的Home目录下创建Docker-compose.yml并写入一下内容

 

membersrvc:   image: hyperledger/fabric-membersrvc   ports:     - "7054:7054"   command: membersrvc vp0:   image: hyperledger/fabric-peer   ports:     - "7050:7050"     - "7051:7051"     - "7053:7053"   environment:     - CORE_PEER_ADDRESSAUTODETECT=true     - CORE_VM_ENDPOINT=unix:///var/run/docker.sock     - CORE_LOGGING_LEVEL=DEBUG     - CORE_PEER_ID=vp0     - CORE_PEER_PKI_ECA_PADDR=membersrvc:7054     - CORE_PEER_PKI_TCA_PADDR=membersrvc:7054     - CORE_PEER_PKI_TLSCA_PADDR=membersrvc:7054     - CORE_SECURITY_ENABLED=true     - CORE_SECURITY_ENROLLID=test_vp0     - CORE_SECURITY_ENROLLSECRET=MwYpmSRjupbT   links:     - membersrvc   command: sh -c "sleep 5; peer node start --peer-chaincodedev"  

2、通过docker-compose up运行已近配置好的节点

 

六、进入容器
1、docker -ps 找到要进入的容器的CONTAINER ID
2、用docker-pid指令获取需要进入容器的PID
>>echo PID=(docker-pid  b4378c920828)
3、借助PID进入容器
>>sudo nsenter --target 10981 --mount --uts --ipc --net --pid

七、测试环境是否搭建好
1、选择源码中的一个例子chaincode机型编译
>>cd$GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
>>go build
2、注册和运行chaincode
>>CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:7051 ./chaincode_example02

3、另起一个终端,进入容器的方式和“六”一样,以WebAppAdmin的形式登录到节点上
>>peer network login WebAppAdmin -p DJY27pEnl16d
4、执行下面的代码,在另外一个终端里面会看到执行结果
安全模式
部署交易
>>CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode deploy -u WebAppAdmin -n mycc -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'
调用交易
>>CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode invoke -u WebAppAdmin -l golang -n mycc -c '{"Function": "invoke", "Args": ["a", "b", "10"]}'
查询交易
>>CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode query -u WebAppAdmin -l golang -n mycc -c '{"Function": "query", "Args": ["b"]}'

以太坊挖矿教程之以太坊Linux系统挖矿教程

 Geth客户端的CPU挖矿效率非常低,纯属鸡肋。如对CPU挖矿感兴趣,请参照此帖。下面介绍GPU挖矿。

  硬件

  GPU挖矿需要1-2GB显存(译者注:1GB显存不可以),显存不够会一直报错。GPU矿机是基于OpenCL的,所以AMD显卡比NVIDI显卡更有效率。

  ASIC和FPGA(即专业矿机)是无效的。

  根据自己的显卡类型和系统,选择openCL:

  AMD SDK openCL

  NVIDIA CUDA openCL

  Ubuntu系统

  AMD显卡

  • 地址1

  • 地址2

  下载: ADL_SDK8.zip 和 AMD-APP-SDK-v2.9-1.599.381-GA-linux64.sh

  ./AMD-APP-SDK-v2.9-1.599.381-GA-linux64.sh

  ln -s /opt/AMDAPPSDK-2.9-1 /opt/AMDAPP

  ln -s /opt/AMDAPP/include/CL /usr/include

  ln -s /opt/AMDAPP/lib/x86_64/* /usr/lib/

  ldconfig

  reboot

  apt-get install fglrx-updates

  // wget, tar, opencl

  sudo aticonfig –adapter=all –initial

  sudo aticonfig –list-adapters

  * 0. 01:00.0 AMD Radeon R9 200 Series

  * – Default adapter

  Nvidia显卡

  使用Ubuntu 14.04和Nvidia显卡的用户请看此帖

  MacOSx系统

  wget http://developer.download.nvidia.com/compute/cuda/7_0/Prod/local_installers/cuda_7.0.29_mac.pkg

  sudo installer -pkg ~/Desktop/cuda_7.0.29_mac.pkg -target /

  brew update

  brew tap ethereum/ethereum

  brew reinstall cpp-ethereum --with-gpu-mining --devel --headless --build-from-source

  检查你的冷却状态:

  aticonfig –adapter=0 –od-gettemperature

  挖矿软件

  Frontier阶段默认的客户端Geth只支持CPU挖矿。我们正在开发Geth客户端的GPU挖矿功能,但是在Frontier阶段完成不了。但是,Geth可以和Ethminer配合进行GPU挖矿。

  C++客户端可以进行GPU挖矿。C++客户端包括eth(命令行用户界面)、AlethZero(图形用户界面)和ethMiner(独立的挖矿软件)。

  在Linux上可以用ppa安装,在MacOS上可以用brew tap安装,或者从源代码安装。

  MacOS系统:

  brew install cpp-ethereum –with-gpu-mining –devel –build-from-source

  Linux系统:

  apt-get install cpp-ethereum

  Windows系统上查看

  利用ethminer进行GPU挖矿

  用eth挖矿:

  eth -m on -G -a -i -v 8 //

  从源代码安装ethminer:

  cd cpp-ethereum

  cmake -DETHASHCL=1 -DGUI=0

  make -j4

  make install

  进行GPU挖矿,你需要一个coinbase账户。你可以本地或者远程设置此账户。

  配合使用ethminer和geth

  geth account new

  geth –rpccorsdomain localhost 2>> geth.log &

  ethminer -G // -G for GPU, -M for benchmark

  tail -f geth.log

  ethminer与geth通过8545端口通信。你可以使用geth –rpcport optoin改变这一默认端口。Ethminer将发现Geth的任何端口。注意,你需要使用–rpccorsdomain localhost色环指CORS数据头。你也可以使用-F http://127.0.0.1:3301为ethminer设置端口。如果你打算在同一台电脑上设置多个挖矿实例,设置端口是必要的。如果你正在一个私有群(cluster)上进行测试,我们推荐你进行CPU挖矿。

  注意,你不许为geth设置–mine参数或者在控制台中开启矿机,除非你想在GPU挖矿之上进行CPU挖矿。

  如果ethminer的默认设置不能工作,请用以下命令指定OpenCL设备:–opencl-device X ,X为0,1,2等。如果运行ethminer -M时,你应该看到类似于如下的信息:

  Benchmarking on platform: { "platform": "NVIDIA CUDA", "device": "GeForce GTX 750 Ti", "version": "OpenCL 1.1 CUDA" }

  Benchmarking on platform: { "platform": "Apple", "device": "Intel(R) Xeon(R) CPU E5-1620 v2 @ 3.70GHz", "version": "OpenCL 1.2 " }

  调试geth:

  geth –rpccorsdomain “localhost” –verbosity 6 2>> geth.log

  调试矿机:

  make -DCMAKE_BUILD_TYPE=Debug -DETHASHCL=1 -DGUI=0

  gdb –args ethminer -G -M

  注意,当进行GPU挖矿时,在geth中hashrate是不可用的。查看ethminer的hashrate,miner.hashrate将一直报告0.

  ethminer和eth

  通过rpc,ethminer也可以和eth配合使用

  eth -i -v 8 -j // -j for rpc

  ethminer -G -M // -G for GPU, -M for benchmark

  tail -f geth.log

  或者你可以单独使用eth进行GPU挖矿:

  eth -m on -G -a -i -v 8 //

Go、Java、Python、Ruby、JS客户端介绍

 

go-ethereum

go-ethereum客户端通常被称为geth,它是个命令行界面,执行在Go上实现的完整以太坊节点。通过安装和运行geth,可以参与到以太坊前台实时网络并进行以下操作:

  • 挖掘真的以太币
  • 在不同地址间转移资金
  • 创建合约,发送交易
  • 探索区块历史
  • 及很多其他

链接:

pyethapp

Pyethapp是以python为基础的客户端,实现以太坊加密经济状态机。python实现旨在提供一个更容易删节和扩展的代码库。Pyethapp利用两个以太坊核心组成部分来实现客户端:

  • pyethereum —— 核心库,以区块链、以太坊模拟机和挖矿为特征
  • pydevp2p —— 点对点网络库,以节点发现和运输多码复用和加密连接为特征

链接:

ethereumjs-lib

正如黄皮书中所说,ethereumjs-lib是核心以太坊功能的javascript库。这是个简单的元模块,提供以下模块。大部分JS模块都在ethereumjs上有跟踪。

  • 虚拟机 – 以太坊虚拟机和状态处理功能
  • 区块链 – 区块链管理
  • 区块 – 区块模式定义和验证
  • 交易 – 交易模式定义和验证
  • 账户 – 账户模式定义和验证
  • rlp – 循环长度前缀序列化
  • Trie – 改良的Merkle Patricia树
  • Ethash – 以太坊工作量证明算法
  • utils – 多样辅助功能
  • devp2p – 网络协议
  • devp2p-dpt – 有争议的对等端表

链接:

Ethereum(J)

Ethereum(J) 是以太坊协议的纯Java实现。它作为可以嵌入任何Java/Scala项目的库提供,并为以太坊协议及附属服务提供完全支持。Ethereum(J)最开始由Roman Mandeleil开发,现在受 <ether.camp>资助。

Ethereum(J)支持CPU挖矿。目前它由纯Java实现,可用于私人和测试网络。你甚至可以在实时以太坊网络上挖矿,但是这样从经济角度来说不划算。

链接:

ethereumH

这个程序包提供了写在Haskell上的工具,能使你连接到以太坊区块链。

链接:

Parity

Parity 声称是世界上最快速最轻便的客户端。它用Rust语言写成,可靠性、性能和代码清晰度都有所增强。Parity由Ethcore开发。Ethcore由以太坊基金会的几个会员创建。

Arch Linux 程序包由Afri Schoedon和quininer进行社群维护。

已经有人报告在树莓派2上成功运行了Parity。

ruby-ethereum

ruby-ethereum是以太坊虚拟机上的一个实现,用Ruby语言写成。

链接:

相关:

  • ruby-serpent: 捆绑在以太坊 Serpent编译器上的Ruby语言.
  • ethereum-ruby: 一个pure-Ruby JSON-RPC包装,用于和以太坊节点交流。要使用这个库,你需要有运行的以太坊节点和可行的IPC支持(默认)。目前支持go-ethereum 客户端。

参考资料:

文章中的列表对应的链接可以参考《Ethereum Homestead Documentation》第41页1.2.4 go-ethereum

以太坊账户管理

 

账户

账户在以太坊中发挥着中心作用。共有两种账户类型:外部账户(EOAs)和合约账户。我们这里重点讲一下外部账户,以下会简称为账户。合约账户简称为合约, 在合约章节具体讨论。把外部账户和合约账户都归入到帐户的一般概念是合理的,因为这些实体都是所谓的状态对象。这些实体都有状态:账户有余额,合约既有余额也有合约储存。所有账户的状态正是以太坊网络的状态,以太坊网络和每个区块一起更新,网络需要达成关于以太坊的共识。对于用户通过交易和以太坊区块链互动来说,账户是必不可少的。

如果我们把以太坊限制为只有外部账户,只允许外部账户之间进行交易,我们就会进入到“代币”系统,“代币”系统不如比特币本身有力,只能用于转移以太币。

账户代表着外部代理人(例如人物角色,挖矿节点 ,或是自动代理人)的身份。账户运用公钥加密图像来签署交易以便以太坊虚拟机可以安全地验证交易发送者身份。

钥匙文件

每个账户都由一对钥匙定义,一个私钥和一个公钥。 账户以地址为索引,地址由公钥衍生而来,取公钥的最后 20个字节。每对私钥 /地址都编码在一个钥匙文件里。钥匙文件是JSON文本文件,可以用任何文本编辑器打开和浏览。钥匙文件的关键部分,账户私钥,通常用你创建帐户时设置的密码进行加密。钥匙文件可以在以太坊节点数据目录的keystore子目录下找到。确保经常给钥匙文件备份!查看备份和恢复账号章节了解更多。创建钥匙和创建帐户是一样的。

  • 不必告诉任何人你的操作。
  • 不必和区块链同步。
  • 不必运行客户端。
  • 甚至不必连接到网络。

当然新账户不包含任何以太币。但它将会是你的,你大可放心,没有你的钥匙和密码,没有人能进入。

转换整个目录或任何以太坊节点之间的个人钥匙文件都是安全的。

警告:请注意万一你从一个不同的节点向另一个节点添加钥匙文件, 账户的顺序可能发生改变。确保不要回复或改变手稿中的索引或代码片段。

创建账号

警告:记住密码并“备份钥匙文件<backup-and-restore-accounts>”。为了从账号发送交易,包括发送以太币,你必须同时有钥匙文件和密码。确保钥匙文件有个备份并牢记密码,尽可能安全地存储它们。这里没有逃亡路径,如果钥匙文件丢失或忘记密码,就会丢失所有的以太币。没有密码不可能进入账号,也没有忘记密码选项。所以一定不要忘记密码。

使用geth account new

一旦安装了geth客户端,创建账号就只是在终端执行 geth account new指令的问题了。

注意不必运行geth客户端或者和区块链同步来使用geth account指令。

1
$ geth account new
1 2 3 4
Your new account is locked with a password. Please give a password. Do not forget this password. Passphrase: Repeat Passphrase: Address: {168bc315a2ee09042d83d7c5811b533620531f67}

对于非交互式使用,你可以提供纯文本密码文件作为—password标志的变元。文件中的数据包含密码的原始字节,后面可选择单独跟着新的一行。

1
$ geth --password /path/to/password account new

警告:用—password标志只是为了测试或在信任的环境中自动操作。不建议将密码保存在文件中或以任何其他方式暴露。如果你用密码文件来使用—password标志,要确保文件只对你自己可阅读和列表。你可以在 Mac/Linux系统中通过以下指令实现:

1 2 3 4
touch /path/to/password chmod 600 /path/to/password cat > /path/to/password >I type my pass

要列出目前在你的keystore文件夹中的钥匙文件的所有账号,使用 geth account指令的list子指令:

1
$ geth account list
1 2 3
account #0: {a94f5374fce5edbc8e2a8697c15331677e6ebf0b} account #1: {c385233b188811c9f355d4caec14df86d6248235} account #2: {7f444580bfef4b9bc7e14eb7fb2a029336b07c9d}

钥匙文件的文件名格式为UTC—<created_at UTC ISO8601>–

。账号列出时是按字母顺序排列,但是由于时间戳格式,实际上它是按创建顺序排列。

 

使用geth控制台

为了用geth创建新账号,我们必须先在控制台模式开启geth(或者可以用 geth attach将控制台依附在已经运行着的事例上):

1 2 3 4 5
> geth console 2>> file_to_log_output instance: Geth/v1.4.0-unstable/linux/go1.5.1 coinbase: coinbase: [object Object] at block: 865174 (Mon, 18 Jan 2016 02:58:53 GMT) datadir: /home/USERNAME/.ethereum

控制台使你能够通过发出指令与本地节点互相作用。比如,试一下这个列出账号的指令:

1 2 3 4 5
> eth.accounts { code: -32000, message: "no keys in store" }

这就表明你没有账号。你也可以从控制台创建一个账号:

1 2 3 4
> personal.newAccount() Passphrase: Repeat passphrase: "0xb2f69ddf70297958e582a0cc98bce43294f1007d"

注意:记得用一个安全性强、随机生成的密码。

我们刚刚创建了第一个账号。如果我们再次试着列出账号,就可以看到新创建的账号了。

1 2
> eth.accounts ["0xb2f69ddf70297958e582a0cc98bce43294f1007d"]

使用 Mist 以太坊钱包

对于相反的命令行,现在有一个基于GUI的选项可以用来创建账号:“官方”Mist以太坊钱包。 Mist以太坊钱包,和它的父项目Mist, 是在以太坊基金会的赞助下开发,因此是“官方”地位。钱包应用有Linux, Mac OS X和Windows可用的版本。

警告:Mist钱包是试用软件,使用需风险自担。

用GUI Mist以太坊钱包创建账号再容易不过了。事实上,第一个账号在应用安装期间就创建出来了。

  • 一、根据你的操作程序下载钱包应用最新版本。由于你实际上会运行一个完整的geth节点,打开钱包应用就会开始同步复制你电脑上的整个以太坊区块链。
  • 二、 解锁下载的文件夹,运行以太坊钱包可执行文件。
  • 三、 等待区块链完全同步,按照屏幕上的说明操作,第一个账号就创建出来了。
  • 四、第一次登录Mist 以太坊钱包,你会看到自己在安装过程中创建的账号。它会被默认命名为主账号(以太库)
  • 五、再另外创建账号很容易;只需点击应用主界面上的添加账号,输入所需的密码即可。

注意: Mist钱包仍在开发中,以上列出的具体步骤可能会随着更新有所变更。

Records:72123456789