ethweb3java
⑴ 以太坊合约地址错误是怎么回事
可能是你的一台放屁的服务器出现了问题,或者是嗯这个服务器暂时有问题,IP地址有问题,都可能出现这样的情况。
⑵ 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
⑶ web3.js如何新建以太坊账户
推荐提问的同学去看看这个完整的区块链新手入门的以太坊DApp开发教程,包括node.js、web3.js、solidity、geth、turffle都会涉及到,应该有帮助:
以太坊DApp入门实战教程
⑷ 以太坊如何使用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()用来提取指定交易的信息,一旦获得交易信息,就可以存入数据库供查询用了。
推荐一个实战入门,你可以看看:以太坊教程
⑸ java中怎么样调用eth的智能合约
一般来说,部署智能合约的步骤为:
1启动一个以太坊节点 (例如geth或者testrpc)。
2使用solc编译智能合约。 => 获得二进制代码。
3将编译好的合约部署到网络。(这一步会消耗以太币,还需要使用你的节点的默认地址或者指定地址来给合约签名。) => 获得合约的区块链地址和ABI(合约接口的JSON表示,包括变量,事件和可以调用的方法)。(译注:作者在这里把ABI与合约接口弄混了。ABI是合约接口的二进制表示。)
4用web3.js提供的JavaScript API来调用合约。(根据调用的类型有可能会消耗以太币。)
⑹ 【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/
⑺ ETH开发实践——批量发送交易
在使用同一个地址连续发送交易时,每笔交易往往不可能立即到账, 当前交易还未到账的情况下,下一笔交易无论是通过 eth.getTransactionCount() 获取nonce值来设置,还是由节点自动从区块中查询,都会获得和前一笔交易同样的nonce值,这时节点就会报错 Error: replacement transaction underpriced
在构建一笔新的交易时,在交易数据结构中会产生一个nonce值, nonce是当前区块链下,发送者(from地址)发出的交易(成功记录进区块的)总数, 再加上1。例如新构建一笔从A发往B的交易,A地址之前的交易次数为10,那么这笔交易中的nonce则会设置成11, 节点验证通过后则会放入交易池(txPool),并向其他节点广播,该笔交易等待矿工将其打包进新的区块。
那么,如果在先构建并发送了一笔从地址A发出的,nonce为11的交易,在该交易未打包进区块之前, 再次构建一笔从A发出的交易,并将它发送到节点,不管是先通过web3的eth.getTransactionCount(A)获取到的过往的交易数量,还是由节点自行填写nonce, 后面的这笔交易的nonce同样是11, 此时就出现了问题:
实际场景中,会有批量从一个地址发送交易的需求,首先这些操作可能也应该是并行的,我们不会等待一笔交易成功写入区块后再发起第二笔交易,那么此时有什么好的解决办法呢?先来看看geth节点中交易池对交易的处理流程
如之前所说,构建一笔交易时如果不手动设置nonce值,geth节点会默认计算发起地址此前最大nonce数(写入区块的才算数),然后将其加上1, 然后将这笔交易放入节点交易池中的pending队列,等到节点将其打包进区块。
构建交易时,nonce值是可以手动设置的,如果当前的nonce本应该设置成11, 但是我手动设置成了13, 在节点收到这笔交易时, 发现pending队列中并没有改地址下nonce为11及12的交易, 就会将这笔nonce为13的交易放入交易池的queued队列中。只有当前面的nonce补齐(nonce为11及12的交易被发现并放入pending队列)之后,才会将它放入pending队列中等待打包。
我们把pending队列中的交易视为可执行的,因为它们可能被矿工打包进最新的区块。 而queue队列因为前面的nonce存在缺失,暂时无法被矿工打包,称为不可执行交易。
那么实际开发中,批量从一个地址发送交易时,应该怎么办呢?
方案一:那么在批量从一个地址发送交易时, 可以持久化一个本地的nonce,构建交易时用本地的nonce去累加,逐一填充到后面的交易。(要注意本地的nonce可能会出现偏差,可能需要定期从区块中重新获取nonce,更新至本地)。这个方法也有一定的局限性,适合内部地址(即只有这个服务会使用该地址发送交易)。
说到这里还有个坑,许多人认为通过 eth.getTransactionCount(address, "pending") ,第二个参数为 pending , 就能获得包含本地交易池pending队列的nonce值,但是实际情况并不是这样, 这里的 pending 只包含待放入打包区块的交易, 假设已写入交易区块的数量为20, 又发送了nonce为21,22,23的交易, 通过上面方法取得nonce可能是21(前面的21,22,23均未放入待打包区块), 也可能是22(前面的21放入待打包区块了,但是22,23还未放入)。
方案二是每次构建交易时,从geth节点的pending队列取到最后一笔可执行交易的nonce, 在此基础上加1,再发送给节点。可以通过 txpool.content 或 txpool.inspect 来获得交易池列表,里面可以看到pending及queue的交易列表。
启动节点时,是可以设置交易池中的每个地址的pending队列的容量上限,queue队列的上容量上限, 以及整个交易池的pending队列和queue队列的容量上限。所以高并发的批量交易中,需要增加节点的交易池容量。
当然,除了扩大交易池,控制发送频率,更要设置合理的交易手续费,eth上交易写入区块的速度取决于手续费及eth网络的拥堵状况,发送每笔交易时,设置合理的矿工费用,避免大量的交易积压在交易池。
⑻ 【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刷新一次。
正常情况下,几十秒内就可以获取到区块信息了。
区块确认数=当前区块高度-交易被打包时的区块高度。
⑼ Web 3综合指南:互联网的未来
现在,你可能已经不止一次听到过 "Web3 "这个词。可能是在工作的时候,在健身房锻炼的时候,或者在晚饭闲聊时听到,也有可能是伴随着朋友发出"为什么狗狗币要把SpaceX带到月球啊! "的咆哮声中听到的。
所有这些关于Web3的讨论可能有点令人不安。毕竟,我们大多数人都还未真正适应Web2中社交媒体创造的新规则,所以仅仅是想到马上就会有一个更新版本的网络,这个念头一定会让人不知所措。
在这里,我们有必要对Web3下一个定义,才能解读这个所谓的互联网的下一个阶段到底是什么。
在我们开始之前,重要的是要注意Web3仍然处于起步阶段。它正在迅速发展,并将在相当长的一段时间内继续发展。但是,尽管Web3的全部影响和最终形式不会很快实现,我们确实对其基本原则有了最本质的理解。 一句话,它是以一个技术项目的生态系统为中心的。
为了准确地理解这些概念的含义,以及为什么它们对Web3如此重要,我们不妨回顾一下互联网发展的轨迹。讨论一下互联网的 历史 ,会让我们更清楚我们要去的地方。
到目前为止,互联网已经有了两个迭代。Web 1.0和Web 2.0。Web 1.0是互联网的恐龙时代,时间跨度从80年代中期到21世纪初。它诞生于1973年,当时美国国防部高级研究计划局(DARPA)开始研究允许计算机在分布式网络上进行通信的协议。对于不熟悉的人来说,协议是标准化的、预先确定的规则,让连接的设备在网络上相互通信。
最早的网络版本是分散的,这意味着它是建立在一系列免费使用的开放协议之上的。与专有协议不同的是,开放协议不能被集中的权威机构所拥有,也不局限于某个特定公司的产品。许多这些早期的网络协议,如HTTP(网络)、SMTP(电子邮件)和FTP(文件传输),是我们所知道和喜爱的现代互联网应用的基础。
在Web 1.0时期,互联网主要由一系列超链接连接起来的页面组成。没有额外的视觉效果或评论窗口,就像我们今天使用互联网时看到的那样。互联网用户只不过是信息的被动接受者,无法进行互动或回应。
那是一个 "只读 "的时代。
网站所有者的主要目的是向尽可能多的读者传播信息,而不是与访问者积极互动。当像IMDB这样的网站刚刚诞生时,网页只是一堆链接,这几乎就是互联网的全部。
在过去的二十年里,我们一直生活在Web 2.0中。它的特点并不是技术上的转变。它源于我们对互联网使用方式的改变。Web 2.0是一个互联的版本,它使用户能够创造、分享和发布内容。普通人不再是一个被动的观察者。相反,每一个人都在发挥着积极的创造作用。
为了说明这到底意味着什么,Web1.0时代的电子商务商店只是一长串的产品名称和价格。读者通过扫描它们,然后他们去实体店进行购买。在Web 2.0中,用户可以使用电子商务网站进行支付,跟踪他们的订单,发表评论,要求退款,等等。事实上,Web 2.0的网站一直在积极鼓励用户参与,从而提高用户的参与度。参考一下Facebook的喜欢按钮或他们的通知系统。两者都是为了吸引读者喜欢、评论或以其他方式参与。谷歌和亚马逊也用类似的方式鼓励用户留下评论。
可悲的是,Web 2.0在很大程度上是由这些中介机构来描述和定义的。
为了找到一个公司或品牌,人们依靠谷歌搜索。要找到有趣的艺术家,人们依靠Instagram或Spotify。为了寻找商品,人们依靠亚马逊。一目了然,使用Web 2.0,就离不开网络巨头们的平台。
像谷歌、Spotify、亚马逊、Facebook和所有其他Web 2.0中的大名鼎鼎的平台,都是中心化的数据聚合者。他们是供应商和消费者之间的中介,在这个过程中,以数据和金钱的形式,获取了几乎所有的价值。
这些多面体平台主要通过实现群体之间的直接互动来创造价值,随着Web 2.0的普及而上升。事实上,它们现在在全球经济中占主导地位,是世界上最赚钱的公司之一。这也伴随着一些问题。
最终,这些平台完全被利益所驱使,这使群体之间的直接互动变得更加困难,因此,中介机构更像是一个路障,而不是一条通途。让我们以Facebook为例。
现在,Facebook是一个中介,它决定了用户和企业何时以及如何互动和参与。谷歌的广告平台和亚马逊的特色产品也是如此。
在Web 2.0中,这些中介机构掌握着全部的权力。他们拥有我们全部数据,决定了我们在网上能做什么,不能做什么,保留了随时关闭我们对平台的访问的权利。无论你属于政治路线的哪一边,你都已经亲眼看到了这些中介机构的力量,比如美国前总统特朗普的推特账户被封停。
这些中介机构还决定我们可以与谁互动,什么时候互动,把我们的时间和注意力卖给最高的广告商。最后,如果这还不够,我们在互联网上使用的大多数工具和服务都是通过亚马逊的AWS云计算服务等地方集中起来的,近三分之一的互联网是通过AWS运行的。
什么是Web3.0?
在Web 2.0之后的阶段被称为Web 3.0,直到Gavin Wood在2014年左右创造了 "Web3"。无论好坏,这个简短的名字坚持了下来。简而言之,Web3就是要消除Web2.0中出现的所有问题。这一代互联网的重点是将权力从大型 科技 公司转移到用户个人身上。
正如一开始提到的,Web3的核心是一个去中心化、无信任、无许可和可互操作的技术产品的生态系统。现在是时候解释这到底意味着什么了。
Web3不是依靠单一的集中式服务器,而是建立在区块链驱动的加密网络之上,使数据能够存储在世界各地的分布式设备(也被称为 "节点")上。最终,这些分布式设备可以是任何东西,如电脑、笔记本电脑,甚至更大的服务器。它们作为区块链的框架,相互沟通,以实现数据的存储、传播和保存,而不需要可信的第三方背书。
由于这些节点,区块链提供了一个不可改变的记录——它是一个去中心化的所有权证明工具,与我们之前看到的任何东西都不同。
随着Web 2.0的发展,我们别无选择,只能将我们的数据交给谷歌和Facebook这样的大型 科技 巨头。我们别无选择,只能依靠AWS提供我们的许多工具和服务。甚至更进一步,我们需要相信这些方面会以道德方式使用这些数据。正如我们在剑桥分析公司的丑闻中看到的那样,我们的数据很容易被用来对付我们,这可能会产生全球性的 社会 政治影响。
像这样的问题就是为什么我们的数据和身份的分散所有权,也被称为 "自我主权身份",比以往任何时候都更重要。
这种自主权所有权是通过MetaMask(用于以太坊和ETH兼容的区块链)或Phantom(用于Solana区块链)等数字钱包实现的。有点像现实世界中的 "钱包",数字钱包作为你的Web3身份,安全地保存你的货币和数据。
这个钱包是可互操作的,这意味着它可以在互联网上无缝携带,并与各种产品和系统一起工作,允许你选择哪些去中心化的应用程序可以访问你的财产。此外,区块链上的所有交易和互动都是无权限的,这意味着它们不需要受信任的第三方的批准就能完成。
今天,个人必须使用他们的Facebook或谷歌登录来访问许多在线应用程序,这迫使他们交出他们的数据。但在Web3中,个人将拥有自己的身份。通过用区块链取代第三方,Web3开启了全新的商业模式和价值链,集中式的中介机构不再受到青睐。最终,Web3将权力从中间商手中夺回,并将其还给个人。
事实上,我们已经在NFTs(不可伪造的代币)上亲眼看到了这一点。
许多艺术家、音乐家和其他创作者最近已经开始尝试他们可以从其作品中获得大部分收入的方式。这在很大程度上可以归功于智能合约的功能,智能合约是编程到区块链中的预定协议,一旦满足指定条款就会自动执行。具体来说,通过NFTs,智能合约允许二级版税结构,这意味着创作者每次在公开市场上交换作品时都能得到报酬。
由于价值链的这一根本性变化,创作者的收入比以往任何时候都多,并慢慢改变了 "饥饿的艺术家 "这一令人痛苦的真实刻板印象。
DAO在Web3中的作用是什么?
伴随着这个新的价值链,Web3孕育了全新的经济组织。去中心化的自治组织(DAO)是整个Web3空间互动的一个核心功能。正如Linda Xi所解释的那样,DAO是围绕着一个任务组织起来的一群人,"通过一套在区块链上执行的共享规则进行协调"。
DAO的主要优势在于,与传统公司不同,区块链为DAO提供了完全的透明度。任何人都可以看到和分析DAO的所有行动和资金。这种透明度大大降低了腐败的风险,防止重要信息被审查。它还确保DAO坚持其承诺。这是因为,像NFT一样,DAO也在智能合约上运行,只要满足某些条件,就可以触发一个行动。例如,在DAO的情况下,智能合约可以确保获得一定数量的赞成票的提案会自动颁布。
与传统的自上而下的组织(几乎所有的公司或非营利组织都是如此)不同,DAO以扁平的等级结构运作,允许所有成员在影响更广泛群体的关键决策中发言--而不仅仅是主要股东。
更重要的是,DAO对普通人来说更容易进入,因为进入的门槛没有那么高。
通常情况下,只有那些被允许在早期投资于一个项目因此而获得大部分财务回报的机构--他们都是有庞大资源和有广阔关系网。
DAO则不然。它们可以在全球范围内参与,而且成本要低得多。
一些加密货币项目也可以被视为DAO,因为其中许多项目是由分散的治理形式管理的,其中代币持有人对项目的未来进行投票。迄今为止,DAO已被用于众筹项目,治理社区,甚至还试图购买美国宪法。
虽然 "Web3 "和 "metaverse "这两个词经常交替使用,但它们是不一样的。
元宇宙被定义为物理世界和虚拟世界的混合体。元宇宙的支持者认为,这样的未来是不可避免的,有一天人类将在一个以某种方式增强的世界中度过大部分时间。这个想法最近获得了很大的吸引力,因为Facebook的创始人马克-扎克伯格将他的社交媒体公司更名为 "Meta",在元宇宙上下了很大赌注。
Web3是一个去中心化的互联网版本,与增强物理现实没有任何关系。虽然许多Web3协议,如NFT或点对点加密货币交易,可能会在未来的metaverse中使用,但Web3并不是metaverse。
尽管如此,Web3还有更严重的问题。
首先,重大的变化带来了重大的风险。Web3最好的部分之一是你对你自己的数据有完全的所有权。这也是最糟糕的部分。Web3空间在很大程度上仍然是一个狂野的西部,充满了不良行为者。由于不依赖中心化的权威机构,你要完全负责的保证你的数据和货币的安全。这意味着要注重钱包安全,不断警惕网络钓鱼计划,并且永远不要泄露你的种子短语(助记词),即使是最值得信赖的Web3协议和平台也会被黑客攻击和暴露,所以始终保持警惕是至关重要的。
总之,在Web3中,不信任并不是一个普遍的真理,你首先需要信任你自己。
还有可扩展性问题。虽然很少有人会认为去中心化本身是一件坏事,但正是因为去中心化,Web3上的交易才会更慢。更改需要由矿工处理并在整个网络中传播,这需要时间。
然后是gas,这是用户为使用世界上最流行的区块链--以太坊区块链所支付的费用。具体来说,"gas "是成功进行区块链交易所需的费用。这些费用在高峰期可以飙升到每笔交易数百美元。
然后是去中心化的难题。尽管区块链可能是去中心化的,但许多使用区块链的Web3服务目前是由数量极少的私人公司控制的。而且人们有理由担心,为支持去中心化网络而出现的行业是高度整合的。
事实上,这远不是一份详尽的担忧清单。然而,如前所述,Web3仍处于起步阶段,许多开发人员正在积极努力解决目前的问题。
因此,Web3被设想为互联网的下一个阶段。这是一个去中心化、隐私至上的互联网时代,用户拥有自己的数据,利润从中心化的中介机构转移到创造者和他们的社区手中。如果解决当前问题的开发人员取得成功,我们可能就会进入Web 3。
⑽ 以太坊web3.sendRawTransaction离线签名交易
工作中需要复现短地址攻击和the重入攻击,重入攻击可以直接通过eth.sendTransaction和remix来发送交易,但是短地址攻击由于钱包和remix这些都对input做了长度检测,无法通过这些方式来复现,只能通过发离线签名交易来实现。
1.环境依赖:nodejs , keythereum , ethereumjs-common , ethereumjs-tx 。
2.进入Node控制台,获取相应账户私钥。
3.签名交易,进入Node,这里注意nonce问题,需要Nonce是实际可执行的nonce,Nonce不对会发送交易失败,关于如何获取input data网络比较多就不详述了。
4.遇到的坑,网络出来的步骤是有问题的或者过时了,当时是参考的这篇文章, https://www.freebuf.com/articles/blockchain-articles/199903.html
,在控制台通过eth.sendRawTransaction发送签名好的交易,我遇到了这个错误 ** sendRawTransaction invalid sender **