⑴ 【以太坊易错概念】nonce, 公私钥和地址,BASE64/BASE58,
以太坊里的nonce有两种意思,一个是proof of work nonce,一个是account nonce。
在智能合约里,nonce的值代表的是该合约创建的合约数量。只有当一个合约创建另一个合约的时候才会增加nonce的值。但是当一个合约调用另一个合约中的method时 nonce的值是不变的。
在以太坊中nonce的值可以这样来获取(其实也就是属于一个账户的交易数量):
但是这个方法只能获取交易once的值。目前是没有内置方法来访问contract中的nonce值的
通过椭圆曲线算法生成钥匙对(公钥和私钥),以太坊采用的是secp256k1曲线,
公钥采用uncompressed模式,生成的私钥为长度32字节的16进制字串,公钥为长度64的公钥字串。公钥04开头。
把公钥去掉04,剩下的进行keccak-256的哈希,得到长度64字节的16进制字串,丢掉前面24个,拿后40个,再加上"0x",即为以太坊地址。
整个过程可以归纳为:
2)有些网关或系统只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,而且base64特别适合在http,mime协议下快速传输数据。Base64使用【字母azAZ数字09和+/】这64个字符编码。原理是将3个字节转换成4个字节(3 X 8) = 24 = (4 X 6)
当剩下的字符数量不足3个字节时,则应使用0进行填充,相应的,输出字符则使用'='占位,因此编码后输出的文本末尾可能会出现1至2个'='。
1)Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。
Base58Check是一种常用在比特币中的Base58编码格式,增加了错误校验码来检查数据在转录中出现的错误。 校验码长4个字节,添加到需要编码的数据之后。校验码是从需要编码的数据的哈希值中得到的,所以可以用来检测并避免转录和输入中产生的错误。使用 Base58check编码格式时,编码软件会计算原始数据的校验码并和结果数据中自带的校验码进行对比。二者不匹配则表明有错误产生,那么这个 Base58Check格式的数据就是无效的。例如,一个错误比特币地址就不会被钱包认为是有效的地址,否则这种错误会造成资金的丢失。
为了使用Base58Check编码格式对数据(数字)进行编码,首先我们要对数据添加一个称作“版本字节”的前缀,这个前缀用来明确需要编码的数 据的类型。例如,比特币地址的前缀是0(十六进制是0x00),而对私钥编码时前缀是128(十六进制是0x80)。 表4-1会列出一些常见版本的前缀。
接下来,我们计算“双哈希”校验码,意味着要对之前的结果(前缀和数据)运行两次SHA256哈希算法:
checksum = SHA256(SHA256(prefix+data))
在产生的长32个字节的哈希值(两次哈希运算)中,我们只取前4个字节。这4个字节就作为校验码。校验码会添加到数据之后。
结果由三部分组成:前缀、数据和校验码。这个结果采用之前描述的Base58字母表编码。下图描述了Base58Check编码的过程。
相同:
1) 哈希算法、Merkle树、公钥密码算法
https://blog.csdn.net/s_lisheng/article/details/77937202?from=singlemessage
2)全新的 SHA-3 加密标准 —— Keccak
https://blog.csdn.net/renq_654321/article/details/79797428
3)在线加密算法
http://tools.jb51.net/password/hash_md5_sha
4)比特币地址生成算法详解
https://www.cnblogs.com/zhaoweiwei/p/address.html
5)Base58Check编码实现示例
https://blog.csdn.net/QQ604666459/article/details/82419527
6) 比特币交易中的签名与验证
https://www.jianshu.com/p/a21b7d72532f
⑵ ETH转账的2种方式的对比
web3j支持使用以太坊钱包文件(推荐)和以太网客户端管理命令来发起一笔交易。当你创建了一个拥有以太币的账户后,你可以通过以下两种交易机制,和以太坊网络(私网/公网)交易:
这里主要讲一下 线下签名交易(Offline transaction signing) 。线下签名交易允许你使用web3j提供的钱包账户发起交易,你完全控制自己的私钥,交易发送到网络上的其它节点并广播。
线下签名交易使用 RawTransaction 对象来完成,一共有如下几步:
1、通过私钥或密码+钱包文件(keystore)来加载转账凭证Credentials
2、获取发起转账账户的nonce 值,也就是第几笔交易
3、创建 RawTransaction交易 对象
4、签名 RawTransaction 对象,也就是对交易做签名
5、发送交易( RawTransaction 对象)给节点处理。
6、获取交易哈希值TxHash
以太坊实战-再谈nonce使用陷阱: https://blog.csdn.net/wo541075754/article/details/79054937
此外,还有一种简单的转账方式
这种方式,不需要自己管理nonce。
这2种方式都是离线交易,先组装交易,然后发送到链上。
参考:
https://docs.web3j.io/getting_started.html#transactions
https://www.jianshu.com/p/6650d2a3aea9
⑶ 比特币区块里的各个字段含义(先写了个nonce)
nonce是个啥意思?根据bitcoin wiki
nonce是一个4-byte大小的区域,nonce的值设定使得该块的hash是以一串0开头的。
对于块数据的一点点改变(比如nonce)都会引起block hash的巨大变化。由于逆向预测hash值相对应的一组bit值(hash原文)是不可行的,在尝试足够多的nonce值且计算每个nonce值相对应的block hash之后可以找到一个满足有指定数量 0 bits (0比特位) 的hash值。而 0 bits的数量值是由difficult设定的。最终产生的hash须得是一个小于当前difficulty值。
因为这个迭代的计算耗费时间和资源,块的出现也就是得到了正确的nonce值,这构成了 proof of work
关于以太坊里的nonce 网上很多解释,很多一上来就是 交易计数器 , 然而却把跟POW有关的丢了吗?事实上以太坊里的nonce有两种意思,一个是proof of work nonce,一个是account nonce。
那智能合约呢?合约也算是Account的一种,那也有nonce吗?
是的,而且合约里面的nonce也差不多,也是一个counter。在智能合约里,nonce的值代表的是该合约创建的合约数量。只有当一个合约创建另一个合约的时候才会增加nonce的值。但是当一个合约调用另一个合约中的method时 nonce的值是不变的。
在以太坊中nonce的值可以这样来获取(其实也就是属于一个账户的交易数量):
但是这个方法只能获取交易once的值。目前是没有内置方法来访问contract中的nonce值的,除了自己定义一个counter来计数...
那好,再来看一下Ethereum Block中的nonce:
以太坊和比特币区块链一样,也需要proof of work(计划转移到股份证明也早已在做了)。在比特币区块链中,pow应该是要算出一个符合难度要求的值,通常是以一串0开头的。这个难度一直在变化。可以查看 比特币区块链的POW难度变化 。
⑷ 【ETH钱包开发03】web3j转账ETH
在之前的文章中,讲解了创建、导出、导入钱包。
【ETH钱包开发01】创建、导出钱包
【ETH钱包开发02】导入钱包
本文主要讲解以太坊转账相关的一些知识。交易分为ETH转账和ERC-20 Token转账,本篇先讲一下ETH转账。
1、解锁账户发起交易。钱包keyStore文件保存在geth节点上,用户发起交易需要解锁账户,适用于中心化的交易所。
2、钱包文件离线签名发起交易。钱包keyStore文件保存在本地,用户使用密码+keystore的方式做离线交易签名来发起交易,适用于dapp,比如钱包。
本文主要讲一下第二种方式,也就是钱包离线签名转账的方式。
交易流程
1、通过keystore加载转账所需的凭证Credentials
2、创建一笔交易RawTransaction
3、使用Credentials对象对交易签名
4、发起交易
注意以下几点:
1、Credentials
这里,我是通过获取私钥的方式来加载 Credentials
还有另外一种方式,通过密码+钱包文件keystore方式来加载 Credentials
2、nonce
nonce是指发起交易的账户下的交易笔数,每一个账户nonce都是从0开始,当nonce为0的交易处理完之后,才会处理nonce为1的交易,并依次加1的交易才会被处理。
可以通过 eth_gettransactioncount 获取nonce
3、gasPrice和gasLimit
交易手续费由gasPrice 和gasLimit来决定,实际花费的交易手续费是 gasUsed * gasPrice 。所有这两个值你可以自定义,也可以使用系统参数获取当前两个值
关于 gas ,你可以参考我之前的一篇文章。
以太坊(ETH)GAS详解
gasPrice和gasLimit影响的是转账的速度,如果gas过低,矿工会最后才打包你的交易。在app中,通常给定一个默认值,并且允许用户自己选择手续费。
如果不需要自定义的话,还有一种方式来获取。获取以太坊网络最新一笔交易的 gasPrice ,转账的话, gasLimit 一般设置为21000就可以了。
Web3j还提供另外一种简单的方式来转账以太币,这种方式的好处是不需要管理nonce,不需要设置gasPrice和gasLimit,会自动获取最新一笔交易的gasPrice,gasLimit 为21000(转账一般设置成这个值就够用了)。
这个问题,我想是很多朋友所关心的吧。但是到目前为止,我还没有看到有讲解这方面的博客。
之前问过一些朋友,他们说可以通过区块号、区块哈希来判断,也可以通过Receipt日志来判断。但是经过我的一番尝试,只有 BlockHash 是可行的,在web3j中根据 blocknumber 和 transactionReceipt 都会报空指针异常。
原因大致是这样的:在发起一笔交易之后,会返回 txHash ,然后我们可以根据这个 txHash 去查询这笔交易相关的信息。但是刚发起交易的时候,由于手续费问题或者以太网络拥堵问题,会导致你的这笔交易还没有被矿工打包进区块,因此一开始是查不到的,通常需要几十秒甚至更长的时间才能获取到结果。我目前的解决方案是轮询的去刷 BlockHash ,一开始的时候 BlockHash 的值为0x00000000000,等到打包成功的时候就不再是0了。
这里我使用的是rxjava的方式去轮询刷的,5s刷新一次。
正常情况下,几十秒内就可以获取到区块信息了。
区块确认数=当前区块高度-交易被打包时的区块高度。
⑸ 濡備綍鍙栨秷鍙戦佽鍗′綇鐨勪互澶鍧婁氦鏄撳叿浣撴搷浣滄槸浠涔
鍦ㄧ綉缁滄瘮杈冩嫢鍫电殑鏃跺欙紝涓绗斾氦鏄撳氨浼氭湁鍙鑳借鍗″湪浠ュお鍧婄殑鏈鍐充簨鍔℃睜涓銆傞栧厛鐭垮伐瑕佽冭檻Gas璐归珮鐨勪氦鏄擄紝濡傛灉浣犵殑Gas璐规湁鐐逛綆鐨勮瘽锛屽彲鑳藉氨瑕佹帓闃熴備絾鏄鍙栨秷鍗′綇鐨勪氦鏄撳苟涓嶉毦鐨勩傚彧瑕佷綘鎰挎剰锛屽氨鑳藉熼噸鏂伴夋嫨涓涓鏇撮珮鐨凣as璐规潵瀹屾垚鍘熷厛鐨勪氦鏄撱備笅鍒楁槸鍏蜂綋杩囩▼锛
1.棣栧厛瑕佸艰埅鍒颁互澶鍧婃祻瑙堝櫒etherscan.io銆
2.鐒跺悗灏辫佹妸浣犵殑浜ゆ槗鍝堝笇鍊肩矘璐村埌浠ュお鍧婃祻瑙堝櫒鐨勬悳绱㈡爮銆
3.鎺ヤ笅鏉ヨ繘鍏ュ湪浜ゆ槗椤甸潰涓鐐瑰嚮鈥滅偣鍑绘煡鐪嬫洿澶氣濇寜閽銆
4.鐒跺悗灏变細鍑虹幇nonce锛堥殢鏈烘暟锛夛紝闇瑕佹妸杩欎釜鍙风爜璁颁笅鏉ャ
5.鎺ヤ笅鏉ュ氨瑕佸湪浣犵殑閽卞寘閲屽噯澶囦竴绗旀柊鐨勪氦鏄撱
6.鐒跺悗杩涘叆閽卞寘锛岀偣鍑烩滈珮绾р濋夐」锛岃緭鍏ュ拰浣犵殑鍗′綇鐨勪氦鏄撳搱甯屽肩浉鍚岀殑nonce(闇瑕佹敞鎰忕殑鏄:浣犲湪閽卞寘璁剧疆涓鍙浠ヨ佹縺娲昏嚜瀹氫箟nonce鍔熻兘)銆
7.鍙戦佹柊鐨勪氦鏄擄紝鐒跺悗鐐瑰嚮鈥滃揩閫熲滸as璐广
8.鍙瑕佺‘璁や簡锛岄偅涔堜氦鏄撳氨浼氳琚瑙i櫎鏉ユ簮锛氬尯鍧楀嵃璞
鎴戜滑閫氳繃浠ヤ笂鍏充簬濡備綍鍙栨秷鍙戦佽鍗′綇鐨勪互澶鍧婁氦鏄撳叿浣撴搷浣滄槸浠涔堝唴瀹逛粙缁嶅悗,鐩镐俊澶у朵細瀵瑰備綍鍙栨秷鍙戦佽鍗′綇鐨勪互澶鍧婁氦鏄撳叿浣撴搷浣滄槸浠涔堟湁涓瀹氱殑浜嗚В,鏇村笇鏈涘彲浠ュ逛綘鏈夋墍甯鍔┿
⑹ 以太坊转账流程
发起:用户在本地的以太坊钱包软件中选择要发送的交易地址(From)、输入目标地址(To)、金额(Value)、是否部署或调用合(Data)、手续费单价(Gasprice)等,确认发送至以太坊节点节点和钱包可以是同一台
广播:节点收到(或自己发起)交易后,会对交易进行验证。验证:交易的签名、发起账号的余额是否能支付转账余额与手续费、Nonce是否为账号已发出的交易数。验证为合法后,将交易加入节点的交易池中交易池中存储着待打包的交
安装以太坊浏览器钱包插件,创建钱包,获取虚拟以太币,进行转账交易。 实验内容 学习 初识以太坊,发送交易 1.学习《初始以太坊,发送交易》,虚拟以太币交易。