A. 以太坊钱包转账实战记录
最近项目中,要求给客户退款。 虽然之前我们写的服务封装了以太坊钱包转账的诸多细节,可以很方便的转账,但考虑再三,觉得最安全的方式还是用钱包本身的命令来转账。话不多说,这里记录下用以太坊钱包转账的步骤:
1. 首先网络搜索了下,网上此类的文章还不少。看了一圈后,觉得最好的还是这篇: https://blog.csdn.net/DDFFR/article/details/53673650 geth账户管理转账。
2.开始打开自己的以太坊钱包。查看钱包各个账户的余额。命令:eth.getBalance('0xaddress')
3. 开始转账步骤:
3.1) 解锁账户。命令:personal.unlockAccount("0xaddress123456789",“123456”)。 第一个参数:账户,第二个参数:解锁密码。就是创建这个账户地址时的密码。 其实还有第三个参数,是时间,表示解锁多久。如60,就写0x3c。可以不写,默认是300秒,就是5分钟;
3.2)计算fee:因为想把账户里的钱都退回去,所以要计算一个合理的fee,fee的计算公式:
fee <= gasPrice * gasLimit,对于普通的ETH交易,则gasLimit=21000即可,这个值可看区块浏览器的交易,一般都是这个值。而gasPrice则需要自己确定,这个是浮动的。获取方式:通过钱包的:
eth.gasPrice 来获取钱包本身推荐的矿工费。也可自己给一个值。但记住,给太低就没人打包了;
而对于gasLimit,钱包的值各不相同。如果不在乎手续费的话,可以用后面提到了的转账命令,给自己的账户发送一个0eth的转账,来获取本钱包的gaslimit参数。
3.3)计算实际款额度:
amout = 账户的余额-fee
3.4)转账命令:
有几个方式:
gasprice/gaslimit由钱包本身指定: eth.sendTransaction({from: '0xfromaddress', to: '0xtoaddress', value: web3.toWei(1, "ether")})
eth.sendTransaction({from: '0xfromaddress', to: '0xtoaddress', value: web3.toWei(0, "ether")})//通过这个可以获取钱包本身提供的 gasLimit默认参数。
自己指定gasprice/gaslimit:eth.sendTransaction({from: '0xfromaddress', to: '0xtoaddress', gasPrice: web3.toWei(30, 'gwei'), gas:21000, value: web3.toWei(1, "ether")})
这里用到了web3.toWei()函数,这个函数表示将第一个数字参数变成最小以太坊单位Wei表示的一个数字。第二个参数表示这个参数的单位。可以是1Gwei = 10^9 Wei,1 ether=10^18 Wei.
如果出现错误,根据提示修改参数。如果成功,则返回一个交易id。根据这个id到浏览器上查看交易状态即可。
上面步骤要在解锁时间范围内完成,要不就提示账户被锁定的信息。感觉以太坊这点做得还是挺好,挺安全的。
在做上面步骤时,这里还遇到了一个坑,就是有个服务会扫描钱包账户,进行资金归集。对此,为了操作不被打断。必须先停止对这个钱包操作的所有服务,否则会中断转账流程,引起不必要的安全隐患。所以切记:转账前,保证只有你自己在操作钱包;转账前,保证只有你自己在操作钱包;转账前,保证只有你自己在操作钱包;
B. 以太坊是什么丨以太坊开发入门指南
以太坊是什么丨以太坊开发入门指南
很多同学已经跃跃欲试投入到区块链开发队伍当中来,可是又感觉无从下手,本文将基于以太坊平台,以通俗的方式介绍以太坊开发中涉及的各晦涩的概念,轻松带大家入门。
以太坊是什么
以太坊(Ethereum)是一个建立在区块链技术之上, 去中心化应用平台。它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用。
对这句话不理解的同学,姑且可以理解为以太坊是区块链里的Android,它是一个开发平台,让我们就可以像基于Android Framework一样基于区块链技术写应用。
在没有以太坊之前,写区块链应用是这样的:拷贝一份比特币代码,然后去改底层代码如加密算法,共识机制,网络协议等等(很多山寨币就是这样,改改就出来一个新币)。
以太坊平台对底层区块链技术进行了封装,让区块链应用开发者可以直接基于以太坊平台进行开发,开发者只要专注于应用本身的开发,从而大大降低了难度。
目前围绕以太坊已经形成了一个较为完善的开发生态圈:有社区的支持,有很多开发框架、工具可以选择。
智能合约
什么是智能合约
以太坊上的程序称之为智能合约, 它是代码和数据(状态)的集合。
智能合约可以理解为在区块链上可以自动执行的(由事件驱动的)、以代码形式编写的合同(特殊的交易)。
在比特币脚本中,我们讲到过比特币的交易是可以编程的,但是比特币脚本有很多的限制,能够编写的程序也有限,而以太坊则更加完备(在计算机科学术语中,称它为是“图灵完备的”),让我们就像使用任何高级语言一样来编写几乎可以做任何事情的程序(智能合约)。
智能合约非常适合对信任、安全和持久性要求较高的应用场景,比如:数字货币、数字资产、投票、保险、金融应用、预测市场、产权所有权管理、物联网、点对点交易等等。
目前除数字货币之外,真正落地的应用还不多(就像移动平台刚开始出来一样),相信1到3年内,各种杀手级会慢慢出现。
编程语言:Solidity
智能合约的默认的编程语言是Solidity,文件扩展名以.sol结尾。
Solidity是和JavaScript相似的语言,用它来开发合约并编译成以太坊虚拟机字节代码。
还有长像Python的智能合约开发语言:Serpent,不过建议大家还是使用Solidity。
Browser-Solidity是一个浏览器的Solidity IDE, 大家可以点进去看看,以后我们更多文章介绍Solidity这个语言。
运行环境:EVM
EVM(Ethereum Virtual Machine)以太坊虚拟机是以太坊中智能合约的运行环境。
Solidity之于EVM,就像之于跟JVM的关系一样,这样大家就容易理解了。
以太坊虚拟机是一个隔离的环境,在EVM内部运行的代码不能跟外部有联系。
而EVM运行在以太坊节点上,当我们把合约部署到以太坊网络上之后,合约就可以在以太坊网络中运行了。
合约的编译
以太坊虚拟机上运行的是合约的字节码形式,需要我们在部署之前先对合约进行编译,可以选择Browser-Solidity Web IDE或solc编译器。
合约的部署
在以太坊上开发应用时,常常要使用到以太坊客户端(钱包)。平时我们在开发中,一般不接触到客户端或钱包的概念,它是什么呢?
以太坊客户端(钱包)
以太坊客户端,其实我们可以把它理解为一个开发者工具,它提供账户管理、挖矿、转账、智能合约的部署和执行等等功能。
EVM是由以太坊客户端提供的。
Geth是典型的开发以太坊时使用的客户端,基于Go语言开发。 Geth提供了一个交互式命令控制台,通过命令控制台中包含了以太坊的各种功能(API)。Geth的使用我们之后会有文章介绍,这里大家先有个概念。
Geth控制台和Chrome浏览器开发者工具里的面的控制台是类似,不过是跑在终端里。
相对于Geth,Mist则是图形化操作界面的以太坊客户端。
如何部署
智能合约的部署是指把合约字节码发布到区块链上,并使用一个特定的地址来标示这个合约,这个地址称为合约账户。
以太坊中有两类账户:
· 外部账户
该类账户被私钥控制(由人控制),没有关联任何代码。
· 合约账户
该类账户被它们的合约代码控制且有代码与之关联。
和比特币使用UTXO的设计不一样,以太坊使用更为简单的账户概念。
两类账户对于EVM来说是一样的。
外部账户与合约账户的区别和关系是这样的:一个外部账户可以通过创建和用自己的私钥来对交易进行签名,来发送消息给另一个外部账户或合约账户。
在两个外部账户之间传送消息是价值转移的过程。但从外部账户到合约账户的消息会激活合约账户的代码,允许它执行各种动作(比如转移代币,写入内部存储,挖出一个新代币,执行一些运算,创建一个新的合约等等)。
只有当外部账户发出指令时,合同账户才会执行相应的操作。
合约部署就是将编译好的合约字节码通过外部账号发送交易的形式部署到以太坊区块链上(由实际矿工出块之后,才真正部署成功)。
运行
合约部署之后,当需要调用这个智能合约的方法时只需要向这个合约账户发送消息(交易)即可,通过消息触发后智能合约的代码就会在EVM中执行了。
Gas
和云计算相似,占用区块链的资源(不管是简单的转账交易,还是合约的部署和执行)同样需要付出相应的费用(天下没有免费的午餐对不对!)。
以太坊上用Gas机制来计费,Gas也可以认为是一个工作量单位,智能合约越复杂(计算步骤的数量和类型,占用的内存等),用来完成运行就需要越多Gas。
任何特定的合约所需的运行合约的Gas数量是固定的,由合约的复杂度决定。
而Gas价格由运行合约的人在提交运行合约请求的时候规定,以确定他愿意为这次交易愿意付出的费用:Gas价格(用以太币计价) * Gas数量。
Gas的目的是限制执行交易所需的工作量,同时为执行支付费用。当EVM执行交易时,Gas将按照特定规则被逐渐消耗,无论执行到什么位置,一旦Gas被耗尽,将会触发异常。当前调用帧所做的所有状态修改都将被回滚, 如果执行结束还有Gas剩余,这些Gas将被返还给发送账户。
如果没有这个限制,就会有人写出无法停止(如:死循环)的合约来阻塞网络。
因此实际上(把前面的内容串起来),我们需要一个有以太币余额的外部账户,来发起一个交易(普通交易或部署、运行一个合约),运行时,矿工收取相应的工作量费用。
以太坊网络
有些着急的同学要问了,没有以太币,要怎么进行智能合约的开发?可以选择以下方式:
选择以太坊官网测试网络Testnet
测试网络中,我们可以很容易获得免费的以太币,缺点是需要发很长时间初始化节点。
使用私有链
创建自己的以太币私有测试网络,通常也称为私有链,我们可以用它来作为一个测试环境来开发、调试和测试智能合约。
通过上面提到的Geth很容易就可以创建一个属于自己的测试网络,以太币想挖多少挖多少,也免去了同步正式网络的整个区块链数据。
使用开发者网络(模式)
相比私有链,开发者网络(模式)下,会自动分配一个有大量余额的开发者账户给我们使用。
使用模拟环境
另一个创建测试网络的方法是使用testrpc,testrpc是在本地使用内存模拟的一个以太坊环境,对于开发调试来说,更方便快捷。而且testrpc可以在启动时帮我们创建10个存有资金的测试账户。
进行合约开发时,可以在testrpc中测试通过后,再部署到Geth节点中去。
更新:testrpc 现在已经并入到Truffle 开发框架中,现在名字是Ganache CLI。
Dapp:去中心化的应用程序
以太坊社区把基于智能合约的应用称为去中心化的应用程序(DecentralizedApp)。如果我们把区块链理解为一个不可篡改的数据库,智能合约理解为和数据库打交道的程序,那就很容易理解Dapp了,一个Dapp不单单有智能合约,比如还需要有一个友好的用户界面和其他的东西。
Truffle
Truffle是Dapp开发框架,他可以帮我们处理掉大量无关紧要的小事情,让我们可以迅速开始写代码-编译-部署-测试-打包DApp这个流程。
总结
我们现在来总结一下,以太坊是平台,它让我们方便的使用区块链技术开发去中心化的应用,在这个应用中,使用Solidity来编写和区块链交互的智能合约,合约编写好后之后,我们需要用以太坊客户端用一个有余额的账户去部署及运行合约(使用Truffle框架可以更好的帮助我们做这些事情了)。为了开发方便,我们可以用Geth或testrpc来搭建一个测试网络。
注:本文中为了方便大家理解,对一些概念做了类比,有些严格来不是准确,不过我也认为对于初学者,也没有必要把每一个概念掌握的很细致和准确,学习是一个逐步深入的过程,很多时候我们会发现,过一段后,我们会对同一个东西有不一样的理解。
C. 以太坊开发(2):在以太坊私有链上的基本操作
在上一讲 如何使用geth搭建以太坊私有链 完成了私有链的搭建,下面介绍在私有链上的基本操作。
启动私有链后在命令行输入:
执行完之后可以查看到生成的账户地址为
查询账户余额:
刚刚创建的私有链账户都是没有余额的,需要通过挖矿才会产生eth,下面介绍如何在私有链上挖矿。
在geth环境下执行:
这时候查看日志geth.log可以看到以太坊私有链有个启动的百分比,到100就正式启动了:
挖矿开始:
这时候有个疑问,挖矿挖到的eth到哪了,其实默认到了eth.account[0],就是第一个账户上:
如何修改挖矿所得的账户:
命令如下:
下面开始进行转账:
这时候出现报错,原因是转账的账户没有解锁,需要输入密码解锁转账的账户才能完成转账操作:
D. 以太坊官网钱包怎么用
通过官网注册生成钱包。
第1步打开以太坊在线钱包。
第2步输入密码。
第3步生成钱包。
第4步记录并打印钱包。
第5步导入钱包。
第6步发送以太币。
以太坊钱包是一个比特币区块链媒体平台。以太坊区块链浏览器,实现比特币交易,达到快速充值提现的目的。
E. Docker 搭建以太坊私有链
首先需要安装 Docker,Docker 的安装和使用可以参看阮一峰老师的 《Docker 入门教程》 。
Ethereum 官方是支持 docker 的,可以参看 官方文档 。
centOS
其中 -v /home/linshan/works/block-chain/ethereum:/root 是把我们当前的 ethereum 目录,挂到了docker 的 /root 下。
在 Windows 环境下使用 -v /home/linshan/works/block-chain/ethereum:/root 不能启动容器,原因不明,所以在 Windows 下先不要使用目录挂载。
各字段具体用途参看 官方文档 。
Windows
Windows 不必创建 start-ethereum.sh 文件, genesis.json 也可以在 Docker 容器启动后创建。
centOS
Windows
运行成功后执行
进入 docker 容器命令行
因为 Windows 没有挂载共享目录,所以 root 目录下没有 genesis.json 文件,我们要在这里手动创建 genesis.json 文件,内容要和 centOS 的一致。
data 用来存放区块数据
geth 的参数参看 以太坊客户端Geth命令用法-参数详解
启动私有节点后进入 geth 命令行执行:
输出的内容就是节点信息,我们在手动连接节点是会用到,注意要把“0.0.0.0“换成你自己的IP,然后将这个信息发送给其他节点。手动连接节点有两种方式:
当然不管使用哪种方法连接节点都要保证创世区块文件 genesis.json 一致,还有在启动时 networkid 也要一致。
至此以太坊私有链已搭建完毕。
geth命令
docker命令
F. Metamask手机端:手把手教你注册以太坊钱包
第一步:前面几个安全提示,向下滚动到最底部表示全部阅读,一步一步点击“接受”就行了
2.下面是创建一个8位数的密码,每次打开MetaMask可能都需要,如果忘记了密码,可以用助记词找回钱包
3.接下来是显示的助记词,可以直接点击“我已妥善保存”,最好还是保存一下,以备不时之需。这里也可以不保存,之后在设置里面,显示助记词,也能找到。
4.之后就进去了MetaMask钱包主页面
5.点击右上角小圆圈,点击创建账户,可以创建更多的账户地址(所有创建的地址都可以通过刚刚的12个助记词导入,比如你创建了10个地址,下次导入的时候初始显示1个地址,你在点击9次创建账户,之前的10个地址账户就完全不变的找回来了)
6.如果你在官方钱包,imtoken钱包,myetherwallet钱包已有账户可以导入,方法和创建钱包差不多
7.点击“发送”,输入你想转账的以太地址和数量,就可以转账了。(交易数据可以不填)
8.交易费限制,和气体价格可以设置一下(如果不在乎交易时间,气体价格可以设置低一些,如果想快速交易,气体价格设高一些,如果是发送代币或者部署合约,交易费限制建议填高一些以免交易气体gas不足),之后点击提交,就成功转账了。
9.成功发送交易后,会显示交易概况。
10.点击账户旁边的三个小点,点击“通过Etherscan查看账户"可以查看区块链浏览器的详情。
11、点击三个点,点击导出私钥,可以导出该地址私钥。
12、.点击右上角三条杠,点击设置,再点击助记词,可以查看你的助记词,助记词非常重要。
13.点击添加代币,可以添加其它基于以太坊的发币,输入缩写即可。
14.如果没有搜索到你需要的代币,可以通过合约地址自动添加,输入合约地址,代币符号,小数位精度即可添加。
G. 一步一步教你使用以太坊钱包
下面开始介绍myetherwallet
记住,这个钱包只支持如下几种
ETH、ETC、和符合ERC20协议的token,
其他 不支持的币不要转进来(转进来会丢失)
浏览器打开网站:
https://www.myetherwallet.com
在页面右上角选择你喜欢的语言,如下图所示
第一步 创建钱包
输入密码(至少9位)
下载keystore文件(这里保存你的公钥和私钥)
保存你的私钥
初次解锁钱包(建议一定要多试下第二步,不要立马就转币进去,否则有可能你没记住密码或者keystore没放好,多试几次可以让你更加熟悉)
一般初次点击解锁之后,页面可能不刷新,直接鼠标往下滚下来就看到你的钱包信息了
第二步 查看钱包信息
当你完成了第一步,钱包就已经建好了。
这一步只是教你平时怎么打开钱包看看里面的余额之类的
你的ETH的余额和交易历史
你的所有代币token的余额和交易历史
第三步 接收和发送ETH及其他token代币
接收ETH和其他的代币token(这个钱包所支持的,点击show all tokens看所有支持的代币)
都用同一个地址即可,不需要任何额外的标记或操作
点击左上角 发送以太币/发送代币,选择keystoreFile,
上传keystore文件,填写密码,解锁账号
3.发送给别人ETH或代币的时候,你就要输入对方对应的ETH地址或代币地址,不要填错,
比如你要发送到你的交易平台,如果发送EOS,这里就要放你交易平台的EOS的充值地址,
而不是放ETH充值地址,当然你还需要在下面这个下拉菜单这里选择一下相应的代币类型,
比如EOS
H. Geth实现以太账户之间转账
1、打开控制台
F:\Geth>geth --datadir "data" console
2、查看目前所拥有的账户列表
> eth.accounts
[""]
3、新建账户
> personal.newAccount('123456')
""
4、查看目前所拥有的账户列表
> eth.accounts
["", "
efed9a8240"]
5、查看账户余额
> eth.getBalance(eth.accounts[0])
665000000000000000000
> eth.getBalance(eth.accounts[1])
0
6、定义变量
> var acc1=eth.accounts[0]
undefined
> acc1
""
> var acc2=eth.accounts[1]
undefined
> acc2
""
7、转账
> eth.sendTransaction({from: acc1 , to: acc2, value: web3.toWei(10,"ether")})
Error: authentication needed: password or unlock
at web3.js:3143:20
at web3.js:6347:15
at web3.js:5081:36
at <anonymous>:1:1
(账户被锁报错)
8、解锁账户
> personal.unlockAccount(acc1,"123456")
true
9、转账
> eth.sendTransaction({from: acc1 , to: acc2, value: web3.toWei(10,"ether")})
INFO [11-14|14:34:24.526] Setting new local account address=0xF4f
INFO [11-14|14:34:24.551] Submitted transaction fullhash=0x98
recipient=0x1DfA2
"0x98"
10、查看账户余额
> eth.getBalance(acc1)
665000000000000000000
> eth.getBalance(acc2)
0
11、挖矿
>miner.start(1);admin.sleepBlocks(20);miner.stop();
12、挖矿结束查看账户余额
> eth.getBalance(acc2)
10000000000000000000
(欢迎打赏,一分也是爱)
I. 以太坊钱包不更新
网络不顺畅或其它。
节点同步慢原因以及解决方法:1、以太坊钱包节点同步需要联网操作,如果你的网络不畅通就会造成同步慢这种情况,所以在同步之前请检查好你的网络,确认网络状况良好在进行同步。2、节点同步需要占用大量的内存,如果你的电脑内存不够就会造成阶段同步慢甚至停止同步这种情况,建议用户在同步节点之前清理一下电脑保证电脑内存充足,目前有用户反映同步节点内存最高可占用100G左右内存哦。3、可以在以太坊钱包中修改peer数,默认peer是25个,建议你可以修改成巨大的数值,例如9999个。4、同步阶段还需要你的路由器支持uPnP。可以在路由器设置中修改。5、需要公网IP,如果你没有的话就会慢很多,所以建议设置一个公网IP吧。6、也有网友反映是钱包本身的问题,以太坊钱包软件本身并不是很成熟,在同步节点的时候会有很多问题出现,这个只有等待以太坊官方修改。7、电脑配置不能太低。8、第一次同步时使用--fast选项,可以更快地同步到最新块。9、使用的是geth,运行时间长了可能会有问题,可以考虑每天重启一次geth。10、及时更新geth到最新版本。11、硬盘空间要足够大,建议至少1T以上。为了运行以太坊全节点,买了500G的硬盘空间,使用--fast同步完成后才占40多G空间,之后正常模式同步硬盘占用空间快速增长,3个月左右已经430G了,最近又买了500G磁盘空间。12、交易未被打包时,相同nonce值可以覆盖之前的交易,覆盖交易只看nonce值,至于交易的其它部分内容可以相同也可以不同。13、如果有低nonce值还未被打包,新的交易gasPrice再高,也需要先等低nonce值的交易被打包,如果低nonce值的交易因为gasPrice设低了而等待,需要先使用相同nonce值来修改gasPrice。
以太币(ETH)是以太坊的一种加密数字代币,被视为“比特币2。0版”,创始人是杰弗里_维尔克。
J. 以太坊之账户
外部账户创建流程:
当使用 geth account new 命令新建账户,最终调用 accountCreate(accountcmd.go)=>keystore.StoreKey=>storeNewKey(key.go)
storeNewKey完成私钥、公钥、地址的生产,最后保存成keystore文件到指定路径。
最后保存的keystore文件为json格式,如下:
以下为用密码可以推出私钥的流程
对交易发起人的地址和nonce进行RLP编码,再算出Keccak哈希值,取后20个字节作为该合约的地址,即: Keccak-256(RLP(sender, nonce))[12:]
函数位于: crypto/crypto.go
账户在区块链上的存储结构,内外账户的结构都是一样
文章github地址