导航:首页 > 以太莱特 > 以太坊web3j接口

以太坊web3j接口

发布时间:2024-02-25 00:28:07

1. 【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刷新一次。

正常情况下,几十秒内就可以获取到区块信息了。

区块确认数=当前区块高度-交易被打包时的区块高度。

2. 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

3. web3.js如何新建以太坊账户

推荐提问的同学去看看这个完整的区块链新手入门的以太坊DApp开发教程,包括node.js、web3.js、solidity、geth、turffle都会涉及到,应该有帮助:

以太坊DApp入门实战教程

4. 「官方」搭建Web3:Filecoin与以太坊携手共进


这是Protocol Labs创始人Juan Benet在EthCC 2021上的演讲概要,查看完整内容:

https://www.bilibili.com/video/BV1eb4y1r7E1

Filecoin网络是面向生态的,它与Protocol Labs搭建模块化解决方案的倾向是一致的。因为它本来就是设计给其他人使用,所以Filecoin在Web3领域的其他栈、应用和生态里如鱼得水。自从其在2020年10月的启动开始,Filecoin已经增长到超过8 exbibytes的可用存储空间,有超过400个项目进入了这个生态。以太坊就是一个能持续证明其可协作性和共同利益的生态系统。

Filecoin + 以太坊

>>>>Filecoin和以太坊虚拟机(EVM)

Filecoin生态意识到网络支持智能合约的好处。最初,开发者社区相信架设在以太坊和Filecoin之间的桥服务足够在Filecoin上支持智能合约了。不过,通过桥来使用智能合约是很笨重的方式,相比于直接在以太坊实现智能合约的功能和可组合性更是不足。有一个提议是在Filecoin上加入以太坊虚拟机(EVM),从而在存储层启用对智能合约的支持,以及为这两个生态的结合提供更多机会。


>>>>开发者工具和资源

Fleek:让用户能为去中心化网络架设网站、存储和分发文件及开发dapp。Fleek可以让每一个人(从专业的开发者到日常的互联网用户)更容易以去中心化的方式创建app和存储文件,从而加速去中心化网络的采用率。Fleek可以在Filecoin上进行自动化存档,并通过ENS(以太坊域名服务)这样的应用来利用以太坊的生态系统。

https://fleek.co/

Web3.Storage:是一个让开发者在Filecoin去中心化存储网络上存取数据的简单接口。Web3.Storage为开发者(包括以太坊dapp开发者)提供了搭建应用的简单方式,这些应用可以带有冗余的去中心化的存储以及安全的内容寻址数据。

http://web3.storage/

PowerLoom:以去中心化的方式将链上和链下数据聚合起来以生成带有密码学证明的快照。它旨在通过一个丰富的节点和利益相关者生态系统(他们被激励参与到协议里)来搭建信任,并按需提供洞见。PowerLoom特别适用于以太坊DeFi这样的生态,这类系统是非常复杂的,而且需要基于验证的信任。

https://powerloom.io/

>>>>DeFi应用

SecuredFinance(https://secured-finance.com/)是一个综合平台,整合了基于智能合约的点对点固定利率贷款、抵押品管理服务、货币间交易和其他类型的利率产品。Secured Finance的协议是去中心化的点对点金融协议,提供了由以太坊智能合约赋能的区块链上的中后台银行业务。Secured Finance可以满足Filecoin网络内的需求,它提供的解决方案能够满足Filecoin存储提供者对FIL贷款的强烈需求。

>>>>数据市场

OceanProtocol(https://t.co/misApE3ggc?amp=1)是一个在Filecoin上搭建的数据市场。Ocean的数据token(data tokens)是以太坊ERC-20 token,可以轻易地用于发布和消费数据服务。如果你有1个数据token,你可以访问一个特定的数据服务。Ocean market是一个专门为数据服务的去中心化交易所,它分叉了一个Balancer AMM(自动化做市商)来降低gas成本。在这个市场中,用户可以对数据进行发布、购买、销售、消费和stake操作。

通过Filecoin,用户可以利用Ocean来发起自己的Filecoin数据市场,或创建一个Filecoin dataDAO或指数基金。通过Ocean Protocol的工具和Filecoin的去中心化存储数据库,我们正见证新生的开放数据经济。


>>>>视频应用

LivePeer:是一个去中心化的在线视频流媒体基础设施,由以太坊区块链确保安全性。将Filecoin和IPFS结合提供存储和内容分发功能后,去中心化视频应用就成为可能了。

https://livepeer.org/

Voodfy:正为私有的视频架设服务提供去中心化工具。这是一个多功能的安全流媒体解决方案,让用户能完全控制自己的内容,这包括了访问权的设定以及变现的方式。它利用了Livepeer、Ethereum、Textile Powergate和Filecoin.

https://voodfy.com/

VideoCoin:正搭建一个能可靠地创建、存储和交易基于视频的NFT解决方案,它可以绕过在以太坊上存储实际内容时固有的复杂性和费用。VideoCoin正将其去中心化视频处理网络与Filecoin整合起来,以搭建首个专门为创建和交易视频NFT服务的平台。这个平台是新生的全球数字收藏品市场急需的一部分。

https://videocoin.io/


>>>>NFT

nft.storage(http://nft.storage/)是一个由Protocol Labs实验室和Pinata支持的服务,它专门为存储NFT数据而设计。

nft.storage让开发者通过内容寻址和去中心化存储来保护其NFT资产和相关的元数据,确保所有的NFT遵循最佳实践以实现长期的可访问性。

未来的使用场景


随着Filecoin和Ethereum生态系统的成长和重叠,会出现更多的新生用例和开发者机会。一些可以进行创新的用例包括:

>>>>可组合的DeFIL

将存储和Defi的世界结合可以产生一些机会。人们可以将市场订单(如要价、出价和交易)带到一个去中心化交易所上,以观察市场是如何评判这些订单的价值的。通过这样的能力,生态系统可以开始想象硬件期货(hardware futures)和时空期货(spacetime futures)等的出现。


>>>>数据丰富的NFT

NFT将会越来越复杂,而Web3社区需要 探索 采用数据丰富(data-rich)的NFT的方式。VideoCoin已经将其视频处理引擎与Filecoin连接起来,以结合以太坊对NFT的支持能力及Filecoin的存储能力。像VideoCoin这样的工具可以用来创建一类新型的NFT,如短电影、视频片段和完整长度的专题特写。


>>>>按观看次数支付的媒体

通过在Filecoin上存储的信息,我们可以利用以太坊的token支持能力去创建由token保护的页面和媒体(文章、电影和音乐等)。我们可以复制Web2时代的按观看次数支付模式,而无需复制数据和广告模型。


这只是一个开始!Filecoin和以太坊生态有长期的协作 历史 和机会,未来可期。

5. Python3 使用Web3.py查询以太坊账户余额

from web3 import Web3

def QuerryBalanceETH(accounts):

    w3 = Web3(Web3.HTTPProvider('https://mainnet. infura .io/v3/ {此处设置自己托管账户ID} '))

    #accounts = w3.eth.accounts

    balance = w3.eth.getBalance(accounts,'latest')#latest表示使用区块链中最后一个块的状态,也就是最后的余额

    print('balance@latest => {0}'.format(balance))

    return balance

1、什么是Infura?

专业一点讲,Infura是一种IaaS(Infrastructure as a Service)产品,目的是为了降低访问以太坊数据的门槛。

通俗一点讲,Infura就是一个可以让你的dApp快速接入以太坊的平台,不需要本地运行以太坊节点。

从程序员的角度讲,Infura就是一个Web3 Provider,背后是负载均衡的API节点集群。使用它的好处就是,你永远不必担心连接的节点失效的问题,Infura会管理好这一切。

除此之外,Infura还可以很方便地接入IPFS,这是另外一个话题,这里就不讨论了。

最后,也是非常重要的一点:Infura目前是免费的。

2、如何使用Infura?

使用Infura首先需要注册一个账户,访问官网 https://infura.io ,点击注册并提供一个邮箱,会收到一封邮件,点击邮件中的链接激活就可以了,然后你就会看到下面的界面:

点击右上角的黑色按钮,创建新项目,就可以生成你专属的Project ID了(左边的红框)。

参考文章: https://blog.csdn.net/TurkeyCock/article/details/85103434

6. 为什么大多数区块链项目不使用java开发

区块链项目对效率的要求比较高,所以大多数核心源码的开发都是使用c/c++。但是如果是做都区块链项目,除非要对源代码进行大量的调整,否则也不见得就不选择使用java。一般的dapp应用,使用java开发应该也是不错的选择。比如以太坊区块链的话,针对java的有web3j的类库,十分方便;比特币的话有bitcoinj类库,也很好用。还是要看还是什么级别的应用,要做什么,以及团队的情况吧。

分享两个java区块链教程:

  1. java比特币详解

  2. java以太坊开发

7. 【ETH钱包开发04】web3j转账ERC-20 Token

在上一篇文章中讲解了ETH转账,这一篇讲一下ERC-20 Token转账。
【ETH钱包开发03】web3j转账ETH

1、直接用web3j的API
2、java/Android调用合约的 transfer 方法

不管用哪种方式来转账,你都需要先写一个solidity智能合约文件来创建ERC-20 Token,然后部署合约,最后才是通过客户端来调用。

注意:erc-20 token转账和eth转账的区别如下:
1、erc-20 token创建交易对象用的是这个方法 createTransaction

2、erc-20 token需要构建 Function ,它其实对应的就是erc-20 token合约中的那些方法。它的第一个参数就是ERC20中那几个方法的名称,第二个参数的话就是对应合约方法中的参数,第三个参数是和第二个参数对应的,按照我那样就行了。转账的话就是 transfer ,我们从合约的 transfer 可以看到第一个参数是收款地址,第二个参数是金额,所以 Function 这里对应起来就好。

这种方法不需要使用web3j封装的方法,而是直接调用solidity合约的方法。

步骤
1、web3j加载一个已经部署的合约
2、验证合约是否加载成功 isValid
3、如何加载合约成功,则调用合约的 transfer 方法

注意:
1、这里的 TokenERC20 是根据solidity智能合约生成的对应的Java类,用于java/Android和智能合约交互的,如果你对这里不太清楚,不妨看看我之前的一篇文章。
以太坊Web3j命令行生成Java版本的智能合约

2、如果加载合约失败,可能的一个原因是合约对应的Java类中的 BINARY 的值不对,这个值是你部署合约成功之后的bytecode,你最好检查对比一下。

我发送一笔交易,可以通过这个地址查询
https://rinkeby.etherscan.io/tx/

8. 使用Web3J与第三方合约交互——批量转账

之前使用NodeJs与智能合约交互,都是访问的自己部署的合约。最近要对线上第三方合约进行转账操作,人数比较多,一笔笔操作起来手指都点断了还容易出错。既然代币Token都遵守ERC20协议,肯定有统一的Transfer(转账)方法供客户端调用,那么编写程序实现自动转账应该可以实现,去查了相关资料发现web3j是不错的选择。

轻量级客户端与以太坊交互的Java库。

既然是调用第三方合约那么肯定需要知道合约地址,合约地址定义了到哪里去访问合约;
ABI(Application Binary Interface): 应用程序二进制接口,定义了智能合约提供的方法功能

若是无法获取到ABI接口,也可以使用solc编译生产bin和abi文件。

(生产代理类时可以指定包路径和类名)

这样一来,便可以使用程序完成批量转账操作。

后来研究发现,使用NodeJs直接调用Web3也可以实现对应功能,不过还是对Java更熟悉一些,就采用了Java的方式。

9. 【ETH钱包开发02】导入钱包

本文主要讲解通过助记词、keystore、私钥 3种方式来导入钱包。导入钱包就是说根据输入的这3者中的一个去重新生成一个新的钱包。导入钱包的过程和创建的过程其实是差不多的。

根据助记词导入钱包不需要原始密码,密码可以重新设置。根据用户输入的助记词,先验证助记词的合规性(格式、个数等),验证正确后,配合用户输入的密码重新生成一个新的钱包。

验证助记词的合规性(格式、个数等)

助记词导入钱包

通过私钥导入钱包其实和创建钱包的过程基本一致。因为私钥在导出的时候转换成了16进制,所以在导入私钥的时候,要把16进制转换为byte数组。

keystore就是钱包文件,实际上就是钱包信息的json字符串。导入keystore是需要输入密码的,这个密码是你最后导出keystore时的密码。将keystore字符串变成walletFile实例再通过 Wallet.decrypt(password, walletFile); 解密,成功则可以导入,否则不能导入。

这是Web3j的API,程序走到这里经常OOM!

具体原因的话,我就不多说了,细节大家可以看这里
https://www.jianshu.com/p/41d4a38754a3

解决办法
根据源码修改 decrypt 方法,这里我用一个已经修改好的第三方库

修改后的解密方法

导入Kestore

1、导入助记词和私钥是不需要以前的密码的,而是重新输入新的密码;导入Keystore则需要以前的密码,如果密码不正确,会提示地址和私钥不匹配。

2、关于备份助记词
用过imtoken的同学可以看到imtoken是可以导出(备份)助记词的。这个一开始我也很困惑,后来了解到其实它实在创建钱包的时候,在app本地保存了助记词,导出只是讲数据读取出来而已。还有一点,imtoken一旦备份了助记词之后,之后就没有备份那个功能了,也就是说助记词在本地存储中删除了;而且导入钱包的时候也是没有备份助记词这个功能的。

10. 以太坊如何使用web3.js或者rpc接口获取交易数据交易时间与确认数

如果要查询主网上的交易记录,可以使用etherscan。但是,如果是你自己搭建的私链,应该如何查询交易记录呢?

答案是你需要自己监听链上的日志,存到数据库里,然后在这个数据库中查询。例如:

varaddr=""
varfilter=web3.eth.filter({fromBlock:0,toBlock:'latest',address:addr});
filter.get(function(err,transactions){
transactions.forEach(function(tx){
vartxInfo=web3.eth.getTransaction(tx.transactionHash);
//这时可以将交易信息txInfo存入数据库
});
});

web3.eth.filter()用来监听链上的日志,web3.eth.getTransaction()用来提取指定交易的信息,一旦获得交易信息,就可以存入数据库供查询用了。

推荐一个实战入门,你可以看看:以太坊教程

阅读全文

与以太坊web3j接口相关的资料

热点内容
以太坊转账开发 浏览:687
2020年新的区块链app 浏览:251
乾特商城20挖矿 浏览:586
数字货币法币有哪些 浏览:709
中药专业委员会区块链技术 浏览:964
日本挖矿留的坑 浏览:504
莱特币矿机型号 浏览:363
比特币还是黄金 浏览:90
什么比特币矿机一天用70度电 浏览:290
苏州数字货币发行情况 浏览:444
什么是联合挖矿 浏览:879
java门罗币挖矿示例 浏览:950
挖矿为什么还质押 浏览:326
我的世界手游版如何开启连锁挖矿 浏览:865
华强北卖矿机的地方 浏览:466
CBT矿机产的矿多久领一次 浏览:613
苗木区块链 浏览:421
以太坊矿机组装多少钱 浏览:674
132以太坊换算人民币是多少钱 浏览:265
以太坊今日分享 浏览:566