以太坊Web3j插件功能探究
原文地址:http://blog.csdn.net/XinLianOrg/article/details/79270941
1. 以太坊概述
以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统,以太坊从诞生到2017年5月,短短3年半时间,全球已有200多个以太坊应用诞生。以太坊是一个平台和一种编程语言,使开发人员能够建立和发布下一代分布式应用。 以太坊可以用来编程,分散,担保和交易任何事物:投票,域名,金融交易所,众筹,公司管理, 合同和大部分的协议,知识产权,还有得益于硬件集成的智能资产。
1.1 以太坊的技术特点
1) 以太坊是一个区块链的开发平台,而非用于交易的加密货币—--创始人Vitalik Buterin。因此,其显著特性是可编程性。
2) 客户端支持多种语言:Go、C++、Python、JavaScript; v Go:go-ethereum(geth)
v C++:cpp-ethereum(ceth)
3) 客户端支持多种操作系统和设备:Linux、FreeBSD、OS X、Windows、Docker、ARM、IOS、智能手机、智能手表、平板电脑;
v 得益于C++的跨平台;
4) 客户端既是服务器端软件(P2P通信、区块链管理、API接口服务)和挖矿软件,又是命令行工具,还是控制台程序。只需客户端即可运行完整的节点;
5) 客户端(geth、ceth)支持Docker容器部署;
6) 提供图形化钱包软件(Mist),内嵌客户端工具,支持转账和智能合约;
7) 支持多种编程接口:JAX-RPC、WS-RPC、IPC-RPC、JavaScript;功能最完善的是JavaScript接口库web3.js;
8) 控制台下可以直接运行JavaScript脚本,可以直接使用Web3.js库;
9) Web应用的页面,可以直接使用Web3.js库,也可以通过Ajax/HttpClient使用JAX-RPC、WS-RPC接口。
10) 以太坊合约的代码使用低级的基于堆栈的字节码的语言写成的,被称为“以太坊虚拟机代码”或者“EVM代码”。
1.2 以太坊的账户
以太坊账户分为两类(均使用20字节的地址代表账户,HEX16转换后是40字节串):
1) 外部控制账户(EOA):由私钥保护的“实体” 账户,存储以太坊网络的以太币;
2) 智能合约账户:由合约代码控制的账户,从区块链的角度看形同一个实体账户,只是人无法直接操作;
3) 前者只能由人发起进行以太币的转账,后者只能在代码的控制下进行以太币转账;
4) 前者可以发送消息给后者,触发其执行相应的指令或业务逻辑,如转账、产品申购等。
5) 交易费用总是由前者提供。如要触发后者运行,前者既要提供发送消息的费用,还要提供合约运行的费用。如提供的费用不足,则合约可能运行到中途结束。此时,全部影响被自动撤销,但交易费用不会退还。交易结束后,多余的Gas自动退还。
1.3 智能合约
1.3.1 业务角度看智能合约
1) 智能合约是根据事先任意制订的规则来自动转移数字资产的系统;
2) 智能合约是事件驱动的、具有状态的、获得多方承认的、运行在区块链之上的程序。该程序能够按照预设的条件,自动地处理其管理的资产。
3) 智能合约是一个机器人,拥有自己的账户,按照其设定程序,可以代替自然人或法人严格地进行仲裁和执行合约;
4) 智能合约存储在区块链上,被矿工计算机自动执行;
5) 智能合约具有数据透明、代码透明、不可篡改、永久运行的特点;
1.3.2 程序员角度看智能合约
1) 智能合约像构建在区块链数据库上的存储过程;
2) 智能合约像类,有属性、方法和构造、析构函数;
3) 智能合约像服务,对外提供同步和异步的消息接口;
4) 智能合约使用类JavaScript高级语言编写,被编译为可以被以太坊区块链虚拟机(EVM)运行的二进制码;
5) 智能合约支持继承;
6) 智能合约可以部署为共享的库;
7) 智能合约编译后由接口描述和二进制执行代码构成。
1.4 以太坊架构描述
● 以太坊是构建在区块链2.0技术之上的应用平台;
● 区块链 2.0
1) 价值知晓:可以从外部数据源获取虚拟币的汇率;
2) 区块知晓:可以读取区块的内部数据;
3) 图灵完备:实现通用的计算机的指令;
4) 智能合约:支持编写和运行智能合约;
5) 平台化,支持多种应用和虚拟币;
6) 更快速地交易,秒级交易确认;
7) 更低能耗,支持多种共识算法。
● 增加多种共识算法和图灵完备的智能合约;
● 引入Gas(燃油)作为服务手续费,增加作恶成本,也阻止死循环程序的执行;
● 以太坊是可编程的区块链;
● 以太坊是运行智能合约的分布式虚拟机(EVM)。
1.5 以太坊的业务特点
● 以太坊的目标是提供一个带有内置的成熟的图灵完备语言的区块链,用这种语言可以创建合约来编码任意状态转换功能;
● 货币单位:(建议普通交易以以太为单位,微交易以芬尼为单位,费用以萨博或伟为单位 --- 因而,以太坊基本不使用小数)
1) wei Wei Dai 戴伟 密码学家,提出b-money思想,首次通过解决计算难题和去中心化共识创造货币;
2) 10^3: babbage Charles Babbage 巴贝奇 英国数学家、发明家兼机械工程师,提出差分机与分析机设计概念,计算机先驱;
3) 10^6: lovelace Ada Lovelace 洛夫莱斯 世界上第一位程序员、诗人拜伦之女
4) 10^9: shannon Claude Elwood Shannon 香农 美国数学家、电子工程师和密码学家,被誉为信息论的创始人;
5) 10^12: szabo Nick Szabo 尼克萨博 密码学家、智能合约的提出者;
6) 10^15: finney Hal Finney 芬尼 密码学家、工作量证明机制(POW)的提出者,结合b-money,创造密码学货币;
7) 10^18: ether 以太
● 支持POW、POS、DPOS等多种共识算法,默认是POW;
● 挖矿奖励(奖励的货币是凭空产生的):
1) 成功挖掘一个有效新区块,奖励 5 以太;
2) 该区块包含的全部交易的服务费中,3/4分配发起交易的各个发起节点,1/4给当前区块的矿工;
3) 对新块确认有贡献的叔叔块,给予87.5%的奖励;以该叔叔块进行计算的侄子块,给予 12.5%的奖励;每个块最多两个叔叔;
● 交易费用:
1) 每个交易都会导致存储、下载、验证的成本,因此需要通过交易费用以控制滥发交易;
2) 交易费用根据计算的复杂度和存储数据的大小由系统自动计算,这称为Gas;
3) 实际支付的费用=Gas*GasPrice。GasPrice默认为0.02萨博,创世纪块可以设置最大GasLimit,以阻止太复杂的智能合约。
● 挖矿效率:
1) 平均12秒挖出1个块;
2) 100小时挖出30000个块;
3) 6个块基本确认1笔交易(1分钟后基本认为交易有效)--- 幽灵协议;
● 消息和交易:消息是账户间传递的数据;交易指外部控制账户发起的消息的签名数据包。
1.6 以太坊常用命令
创建创世纪块:
# geth --networkid 20160817 --datadir /var/gethdata/init init /var/gethdata/genesis.json
启动节点:
# geth --verbosity 4 --networkid "20160817" --datadir /var/gethdata –rpc
以IPCS方式连接本地运行节点,进入控制台:
# geth attach ipc:/var/gethdata/geth.ipc
生成引导节点ID
bootnode --genkey=boot.key
运行引导节点
bootnode --nodekey=boot.key
以下命令在控制台执行:控制台提供 admin、debug、eth、miner、net、personal、rpc、txpool、web3等服务
1) 列出连接的Peers:> admin.peers
2) 列出驻留本节点的账号:> eth.accounts
3) 查询某个账号的余额:> eth.getBalance("0x….")
4) 解锁某个账号:> personal.unlockAccount("0x….")
5) 创建新账号:> personal.newAccount()
6) 账户直接转账:> eth.sendTransaction({from: “0x…付款人”, to: “0x…收款人”, value: …转账金额})
7) 启动挖矿服务:> miner.start(1)
8) 停止挖矿服务:> miner.stop()
1.7 参考资料
1. Web3j的参考文档:https://docs.web3j.io/index.html
2. Spring Boot的参考文档:https://docs.spring.io/spring-boot/docs/current/reference/html/index.html
3. 汪晓明对区块链、以太坊的思考:http://wangxiaoming.com/blog/archives/
4. 以太坊官方网站:https://ethereum.org/
5. 以太坊所有源码地址(官方):https://github.com/ethereum/
6. 以太坊Homestead文档地址(官方):http://www.ethdocs.org/en/latest/index.html
7. 以太坊网络状态地址(官方):https://ethstats.net/
8. 以太坊资源网站(官方):http://ether.fund/
9. Solidity编程文档(官方):http://solidity.readthedocs.io/en/latest/
10. 以太坊网络扫描(官方):http://etherscan.io/
11. 以太坊官方的论坛:http://ethfans.org/topics
12. 以太坊官方博客:https://blog.ethereum.org/
13. 以太坊wiki百科地址:https://github.com/ethereum/wiki/wiki
14. 以太坊中文爱好者网站:http://ethfans.org/
15. 以太坊的gitter的实时交流网站:https://gitter.im/orgs/ethe reum/rooms
16. 以太坊的官方论坛:https://forum.ethereum.org/
17. 以太坊开发框架Truffle说明书:http://truffle.readthedocs.io/en/latest/
18. 以太坊开发框架dapple说明书:http://dapple.readthedocs.io/en/master/
19. 以太坊官方推荐开发框架Meteor说明书:https://github.com/ethereum/wiki/wiki/Dapp-using-MeteorDAO
2 Java Web3J概述
Web3j是一个轻量级,Reactive(响应式),类型安全的Java库,用于与Ethereum网络上的客户端(节点)集成,这允许您使用Ethereum块链,而不需要为平台编写自己的集成代码的额外开销。
2.1 Web3J的提供的功能
1. 通过HTTP和IPC 完成Ethereum的JSON-RPC客户端API的实现
2. Ethereum钱包支持
3. 使用过滤器的函数式编程功能的API
4. 自动生成Java智能合约包装器,以创建、部署、处理和调用来自本地Java代码的智能合约
5. 支持Parity的 个人和Geth的 个人客户端API
6. 支持Infura,所以您不必自己运行一个Ethereum客户端
7. 综合整合测试展示了上述一些场景
8. 命令行工具
2.2 Web3J的依赖的库(中间件)
1. RxJava函数式编程的的API中间件
2. Apache HTTP Client中间件
3. Jackson Core 用于快速JSON序列化/反序列化中间件
4. Bouncy Castle加密解密和 Java Scrypt加密中间件
5. 生成智能合约java包装器类的java源代码(.java)的JavaPoet中间件
6. Java的UNIX域套接字的*nix系统进程间通信API中间件
2.3 启动Ethereum客户端
$ geth --fast --cache = 512 –networkid 2 - -rpcapi “personal,db,eth,net,web3” --rpc --dev
2.4 Web3J的进程间通信IPC
Web3j还支持通过文件套接字快速进行进程间通信(IPC)到在与web3j相同的主机上运行的客户端。在创建服务时,连接只需使用相关的IpcService实现而不是 HttpService:
- 上一篇:没有了
- 下一篇:没有了