巴比特论坛

以太坊Ethereum常见问题FAQ [复制链接]

来自手机版
发表于 2015-9-24 14:42:03 | 显示全部楼层
以太坊常见问题FAQ,有什么问题也可跟帖提问。
  
信息
  
?
任务/问题
答案
如何查看ethereum网络的状态?
如何查看账户、交易和区块?
  
我确信还有其它的方式。有任何建议,请给我发送Email。
想要给我的账户添加email报警,如何实现?
https://etherscan.io/ 有这个很酷的功能。  https://frontier.ether.camp  显然也有,但是我没有试过。
那里可以交易Ethers?
我用 https://poloniex.com/exchange#btc_eth  ,而且非常好用。但请忽视聊天室。 :)
如何查看账户余额?
1.     使用该站  https://etherchain.org (通常都是最新信息)
  
2.     可以使用geth命令行客户端:“web3.fromWei(web3.eth.getBalance(<address>))”。你的客户端必须是最新的,否则信息可能是错误的。  
  
3.     使用 Solidity,<address>.balance.
那里可以查看面额转换?
常用信息
?
任务/问题
答案
Ethereum是什么?
显然,这是一个非常宽泛的问题,但我常用ELI5来给我的非技术背景的朋友解释……
  
比特币中“从A向B发送X”。Ethereum中“如果是J和K,但不是L,那么从A向B发送X”。
  
或者说,所有的比特币通常都存放在参与者的账号中,Ethereum则有第二种类型的账号:合约。合约也是有价值的,而且可以基于一些条件处理其它事情。例如,100个人可以分别支付1美元到一个彩票合约中,该合约承诺会在第100次支付时奖励给一个随意的用户。
Ethereum 有两种类型的账号,“正常的”(想想比特币)和合约。只有哈希值,可以识别出该账号的类型吗?
两种类型的账号有相同长度的哈希值,因此只有这些信息是不够的。合约类型的账号拥有“数据”属性,而“正常”账号则没有。使用“web3.eth.getCode(<address string>)”。如果结果返回“0x”, 意味着是正常账号。如果还有其它结果,意味着是合约。
  
目前在Solidity中也是不可能的。
Gas 是一个新概念。它是什么? “gas/startgas” 和“gasprice”之间的关系是什么?
在比特币中,每一个交易都会给网络创建相同的工作量。在Ethereum中,不同的交易对存储、处理器和内存使用都有不同的消耗,因此这些交易需要相应的“付费”。我找到的最好的“官方”解释如下: (“gas” vs “gasprice” 在第一个项目):
    
  
目前(9/20/15)每个人能在一个交易中花费的最大gas数是3141592个单位。每个单位的最小价格是50000000000 wei.  (0.00000005 ether)。因此,在一个样本交易中以gas形式发送的ether数目如下:
  
3141592 单位 *  50000000000 wei/unit = 157079600000000000 wei (0.1570796 ether).
  
    
indexof.indexOf.sendTransaction("I am  cool", "cool", {from:eth.coinbase,gas:3141592,  gasprice:50000000000});
我看到用“Shannon”作为ETH面额(=.001szabo),但在http://ether.fund/tool/converter.  中没有提到,这是怎么回事?
在这里提到了“Shannon”: https://blog.ethereum.org/2015/08/04/the-thawing-frontier/  
    
----------------
    
Ada = 103 Wei, Babbage = 106  Wei, Shannon = 109 Wei, Szabo = 1012 Wei, Finney = 1015  Wei,
  
Ether = 1018 Wei. 换句话说,Shannon == 1 Gwei == 1  billion Wei
挖矿
?
任务/问题
答案
只用CPU可以挖矿ethereum吗?
可以,但是没有意义。难度已经很高了。你需要很强大的GPU来挖矿。
计算机挖矿Ethers需要的系统RAM是多少?
我搭建的时候图便宜用了4GB的,但是不够,又增加了2GB才开始工作。原因就是挖矿时系统RAM需要在内存中存放大量文件。
如何确定GPU是否能很好地挖矿ethereum?
可用的矿池有那些?

矿工可以“选择”提供的信息或者将其包含在某个交易中,这是什么意思?
Geth
?
任务/问题
答案
geth是什么?
“geth”是在你的电脑上运行节点的Go语言客户端程序。也就是说,它汇集了整个ethereum账本,并接收新区块。你可以用它的控制台来与ethereum网络进行交互。”web3”(你会在很多例子中看到)是geth最常用命令的Javascript库。
  
  
在C++实现中,geth类型的程序称之为“eth”,Python称之为“pyeth”。我不怎么使用它们,但它们的功能是类似的。
如何安装 geth?
该链接称之为“搭建Ethereum”,同时也包含通过各种程序管理包获得binaries的指导链接。我强烈推荐使用程序管理包,这样你可以自动获得最新版本的软件。https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum  
已经安装了geth,如何创建新账号?
如果你参加了2014年的预售(也叫作Ethersale),应该有一个含有你账号的.json文件。使用该命令行(如果你已经启动geth,请关闭它):
  
$> geth wallet import  /path/to/my/presale.wallet
  
否则,用该命令创建一个全新的账号:
  
$> geth  account new
  
Geth 创建了很多日志,无法查看我正在进行的事情。
使用‘geth --verbosity “2” console’启动geth
  
OR avsa:“我认为在很多终端中解决该问题的最好方式是开启第二个窗口,并输入"geth attach",这样所有的日志就会显示在第二个窗口中”(也就是说,”geth”,然后”geth attach”。”geth attach”窗口将会自动进入控制台。)(现在我就是这么做的)。
控制台中如何用非常量的(交易型的)函数立即获得返回值
9/2/2015还不能。首先,用非常量的函数进行sendTransaction,等待该交易被执行(例如,发生),然后使用独立的常量函数来获取你需要的值。
  
在geth内部,显示gas数目需要进行一个sendTransaction 请求
var receipt =  web3.eth.getTransactionReceipt(<transaction hash>), then display  receipt.
如何用sendTransaction给一个非常量的函数发送参数?
对于“function increment(int howmuch, int  _customvalue) { … }” 可以这样做:
  
“incrementer3.increment.sendTransaction(3,9,  {from:eth.coinbase,gas:1000000});”
  
确保你的gas支付是充足的。
如何与之前发布的合约进行交互?
var abi = <cut and paste the contract abi  here>;
  
var contract =  web3.eth.contract(abi).at(<contract address>);
  
contract.functionname();
  
contract.functionname.sendTransaction(...);
  
    
  
[{"constant":false,"inputs":[],"name":"kill","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"getBlockNumber","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_newgreeting","type":"string"}],"name":"setGreeting","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"greet","outputs":[{"name":"","type":"string"}],"type":"function"},{"inputs":[{"name":"_greeting","type":"string"}],"type":"constructor"}]
有时候合约能够编译和部署,而且能将sendTransaction发送到非常量的函数中,但是函数中的逻辑并不会执行。没有错误。
增加您的gas发送数量。在我最终用2天时间实现它之前,也让我非常头疼。
  
Ex:  incrementer3.increment.sendTransaction(3,9, {from:eth.coinbase,gas:1000000});
  
  
9/12/2015:当我用创建的阵列部署合约时,并且试着在阵列的索引中书写一个并不存在的数值时也遇到了该错误。我怀疑产生失败交易的原因很多。确认你的代码。

在交易记录中,”日志”阵列是什么?
{
  
   blockHash:  "0xdcb73cb28e7baaeb1b24e6aeae4e46f7ffea0ee3b5bf1afd8ae5f0eb2312954f",
  
   blockNumber: 224644,
  
   contractAddress:  "0x37f18e3eef435e80f490c0beafd9cf0365686658",
  
   cumulativeGasUsed: 161639,
  
   gasUsed: 161639,
  
  logs: [],
  
   transactionHash:  "0x3411264089ee335cd8e3af7e2e5de775a1088a40853a8576b215e221f5890e5e",
  
   transactionIndex: 0
  
}

在交易记录中,”transactionIndex”是什么?
{
  
   blockHash:  "0xdcb73cb28e7baaeb1b24e6aeae4e46f7ffea0ee3b5bf1afd8ae5f0eb2312954f",
  
   blockNumber: 224644,
  
   contractAddress:  "0x37f18e3eef435e80f490c0beafd9cf0365686658",
  
   cumulativeGasUsed: 161639,
  
   gasUsed: 161639,
  
logs: [],
  
   transactionHash:  "0x3411264089ee335cd8e3af7e2e5de775a1088a40853a8576b215e221f5890e5e",
  
transactionIndex: 0
  
}
  
9/12/2015:我的猜测是它是用于批处理请求的。批处理中的第二个交易是“1”,等等。我会确认此事。
合约 –  编译和发布
?
任务/问题
答案
如何编译合约?
使用chriseth的在线、实时Solidity编译器。相当好用。忽略其它设备吧。:)
    
  
注意:你可以使用cpp-ethereum中的”solc”binary来编译合约,或者使用Mix集成开发环境。我发现Mix会提供编译错误信息,而在线编译器不会(反之亦然),因此你可能会使用多个编译器。
创建和发布最基本的合约
  
注意:实际上这不是最简单的合约,但是对于初学者来讲也很容易理解。
发布之后在控制台中获得合约地址
如果使用在线solidity编译器,发布之后地址就会在geth中显示出来。
  
✓-
对一个特定的区块# 可以做些什么吗?(例如,发布合约或者执行交易)
并不能确保交易发生在下一个区块或者未来的某个特定区块。
  
Imifos on StackOverflow:“你无法确保你的交易包含在某一个区块中,因为这是由矿工决定的,而非交易提交者。”
  
我不确定创建的合约是否能够出现在下一个区块或者未来的某个特定区块中。
交易“负载”是什么?
这只是发送请求时的字节代码“数据”。但我看到它常常与ether区块链混淆了,举例:  
      
第一个是合约创建(更大负载),第二个是终止发送交易。

有可用的反编译器吗?

合约 –  基本概念
创建可以终止并返回资金的合约
在构造器中,msg.sender是创建者。保存。然后终结者(创建者);终止并返回资金。
  
在合约中存储ether
技巧就是用{from:someaddress, value: web3.toWei(3,”ether”)...}创建合约。
  
使用非常量的函数(req sendTransaction)在合约中增加一个变量
在 Solidity中获得合约地址
标记了”常量”的函数和未标记的函数有什么区别?
“常量” 函数能够执行一些操作并返回值,但不能改变状态。换句话说,常量函数无法保存或更新合约或区块链中的任何变量。这些函数是用geth中的contractvariable.someMethod(...)来调用的。
  
  
非常量函数(缺少常量声明)必须使用contractvariable.someMethod.sendTransaction({from:eth.accounts[x],  gas: 1000000})来调用;也就是说,因为它们能够更改状态,因此它们必须发送gas支付来完成工作。
让合约将资金返回到你的coinbase(不使用 suicide(...))
该实例演示了如何将资金从合约发送至一个地址:
  
Mapping是什么,如何使用?
mapping 只是一个  K->V 哈希表。例如,变量[“somekeystring”] 会产生一串数值-> 值映射。.
映射(mapping)是可迭代的吗?
9/2/2015 还不能。开发者chriseth:“我使用秘钥->索引(key->index)映射,并将你的[keys]放入到一个阵列中。”
  
9/11/2015 christian:“在设计中这是不可能的,因为这些秘钥并没有保存在映射中。当编译器支持这些模板和函数库时,就会有像可迭代映射(https://github.com/ethereum/dapp-bin/blob/master/future_solidity/iterable_mapping.sol)  
  
之类的复杂(昂贵)数据结构。”
能从solidity函数调用中返回阵列吗?
在Solidity中如何表征双精度类型/单精度类型(double/float)?
9/2/2015 还不能。
能否像这样: string32[] myarray = {“a”, “b”};内嵌初始化陈列?
  
9/2/2015 还不能。
事件到底是什么,为什么需要它们?
比如说你需要一个在外部有事情发生时进行报警的合约。该合约可以是一个火警事件,你可以从web3(geth内部)得到该事件。
不同的函数可见性是什么?
公共 – 所有 (默认)
  
私有 – 该合约
  
内部 – 该合约和衍生合约
  
外部 – 内部无法访问,只能外部
  
  
合约构建函数必须是公共可见的吗?
不是。设定为私有即可。不确定以后会有其它变化。
一个合约可以有多个构建函数吗?如果可以,它们都是在创建的时候调用吗?
不可以。在相同的合约中不能有多个“function ContractX() {}” 声明,无论是输入还是输出值。
  
时间戳可信吗(现在,区块.时间
  
戳)?
不可信。它们都是由矿工提供的,因此很容易受到攻击。也可以提供其它数值。最好的随机(按照vbuterin的说法)是目前的区块哈希值,因为事先不会知晓。
  
合约函数能返回结构类型吗?
9/2/2015 是的,但是目前只有“内部”函数才可以。
Solidity合约中的  “function () { blah blah; }” 是怎么回事?函数怎么才能没有名称?
9/11/2015: chriseth:“在没有数据(例如,使用contractName.send()),或合约中(例如,你混淆了合约类型)调用了不存在的函数 或者向合约发送新的交易时,才调用[未命名的函数]。”每一个合约只能有一个未命名的函数。
  
顶级合约变量可以内嵌初始化吗? contract Blah { int x =  7; function Blah() {} }
可以,对于单值的基本类型。对于阵列和结构类型则不可以。Ex:“uint8[4] tester = {0,1,2,3};”将不会编译。
“修饰符”关键字是什么?
结构类型的工作原理?
循环的工作原理?
特别像Javascript,除了要声明计数器类型,还要声明“变量”。我没有测试过,但我感觉如果你使用的话,很可能会崩溃,比如,uint8和计数超过255。还有待观察。
  
Solidity使用什么字符集?
就是基本的ASCII。当你将它们作为变量使用时,¥, ž, 等等 (扩展的  ASCII) 和 мŋαмїš (UTF-8)都编译失败。
  
但是Solidity的字符串类型是UTF-8。

合约/交易日志是什么,能用它来做什么?
✓-
基本字符串处理(substring, indexOf, charAt,等等)的实例?
somevar[0] = "0" 行不通。  
  
等待添加更多……
  
9/17/2015: 包含stringUtils  的作品。 https://github.com/ethereum/dapp-bin/blob/master/library/stringUtils.sol  
我能连接两个字符串吗?
不能。我估计很快会实现,但官方还没有这方面的信息。

我了解到的信息是使用<address>.call()与使用一个变量(ContractB b;)来举例说明一个合约并执行它的方法(b.doSomething();)相比,后者更受欢迎。为什么?
未使用的gas会自动退款吗?
是的,而且是即时的。
✓-
当返回“uint”类型的值时,有可能返回“undefined” 或 “null”类型的值吗?
返回值通常都是数字(不像Javascript),在这些例子中默认是0 。
合约 –  高级概念
合约中如何获得随机数?(实现自动返回的游戏合约)
从其它合约用非常量函数返回数值
当第一次挖矿合约时用它来做些事情
使用构造函数。当第一次挖矿合约时,内部的所有都会被执行。
  
对特定的区块# 合约能做什么
说到用完全去中心化的方式来部署一个合约,并对一个特定区块做些事情,这是不可能的。
  
你可以使用web3来从外部调用函数,但那样就增加了中心化。
一个合约可以创建另外一个合约吗?
  
注意:合约循环目前是不可能的。如果你找到了这样的方法,请告知我,因为我可以用它创建一个类似克龙的合约。
如何创建2维阵列?
  
注意:创建uint8+的10x10正方形合约需要花费800,000 gas。17x17的需要2,000,000个gas 。限制是314万个,其实这已经是目前能创建的很低上限了。
  

“合约教程”中写道:
  
p.recipient.call.value(p.amount)(p.data);
  
语法是什么?
合约函数接受2维阵列吗?
当测试的时候好像编译器会崩溃。“类型错误:内部类型不允许用于公共和外部函数。”我正在测试发送一维阵列并编程接收函数,像2维阵列那样处理它。

Byte32和字符串是什么关系?为什么 ‘bytes32 somevar = “stringliteral”;’ 是可行的,保存的32-byte的16进制值
  
意味着什么?
一个合约可以将一个阵列(静态大小)或字符串或字节(动态大小)传递给另外一个合约吗?
目前还不行。第一个肯定是bug,参见See https://github.com/ethereum/solidity/issues/78  
  
我不知道动态大小的阵列/字符串的传递是否应该是支持的,但也是行不通的。
  
    
图片1.png



请将附件或修正内容发送至fivedogit@gmail.com @fivedogit 。如果有兼职或者全职的工作需求,请联系我。我的背景是计算机科学学士、销售工程师、Linux(特别是视频系统)、Java、Spring,Hibernate, AWS 和 CDN/DNS相关的技术。.
打赏: ETH 0xcf684dfb8304729355b58315e8019b1aa2ad1bac
eth 02.jpg

In Blockchain,we trust.

6条回复 跳转到指定楼层

fhctpr42 | 队长 | 发表于 2015-9-24 17:36:19 | 显示全部楼层
先马再看,沙发广告位招租。
虎牙 | 水手 | 发表于 2015-9-27 15:41:21 | 显示全部楼层
BTS 吹得比这个还厉害...  3毛变3分
wangyisong72 | 副船长 | 发表于 2015-9-28 13:54:40 | 显示全部楼层
说得很说详细赞一个
sEan_EAV | 水手 | 发表于 2017-6-12 16:48:20 | 显示全部楼层
虎牙 发表于 2015-9-27 15:41
BTS 吹得比这个还厉害...  3毛变3分

哈哈
大头卡死了 | | 发表于 2018-4-4 09:26:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
Linkea | 管理员 | 发表于 2018-4-4 13:16:08 来自手机版 | 显示全部楼层
看看blockflow.net
高级模式
您需要登录后才可以发帖 登录 | 立即注册 | 用新浪微博登录

本版积分规则

搜索

0关注 0粉丝 5主题

作者的其他主题

返回顶部 返回列表

登录

分享 发帖