如何开发编译部署调用智能合约
在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成。合约位于以太坊区块链上的一个特殊地址。uint storedData; 这行代码声明了一个状态变量,变量名为storedData,类型为 uint (256bits无符号整数)。你可以认为它就像数据库里面的一个存储单元,跟管理数据库一样,可以通过调用函数查询和修改它。在以太坊中,通常只有合约 的拥有者才能这样做。在这个例子中,函数 set 和 get 分别用于修改和查询变量的值。
跟很多其他语言一样,访问状态变量时,不需要在前面增加 this. 这样的前缀。
这个合约还无法做很多事情(受限于以太坊的基础设施),仅仅是允许任何人储存一个数字。而且世界上任何一个人都可以来存取这个数字,缺少一个(可靠 的)方式来保护你发布的数字。任何人都可以调用set方法设置一个不同的数字覆盖你发布的数字。但是你的数字将会留存在区块链的历史上。稍后我们会学习如 何增加一个存取限制,使得只有你才能修改这个数字。
代币的例子
接下来的合约将实现一个形式最简单的加密货币。空中取币不再是一个魔术,当然只有创建合约的人才能做这件事情(想用其他货币发行模式也很简单,只是实现细节上的差异)。而且任何人都可以发送货币给其他人,不需要注册用户名和密码,只要有一对以太坊的公私钥即可。
注意
对于在线solidity环境来说,这不是一个好的例子。如果你使用在线solidity环境 来尝试这个例子。调用函数时,将无法改变from的地址。所以你只能扮演铸币者的角色,可以铸造货币并发送给其他人,而无法扮演其他人的角色。这点在线 solidity环境将来会做改进。
调用 web3.js,连接 infura 节点进行合约转账
利用 web3,调用 erc 20 token 合约,连接 infura 节点,进行转账
批量转账合约,参考 这里 的实现,部分源码如下:
调用 token 合约,授权批量合约转账
调用批量转账合约,进行转账
[快速入门]使用web3j监听besu上智能合约的事件
下面示例通过websocket方式进行事件监听。
包含 原始 监听方法(web3j生成的)和 自定义 监听方法。
开启监听:
日志输出:
web3j调用时间默认15秒。 (详见文件JsonRpc2_0Web3j.class中的DEFAULT_BLOCK_TIME)
开启监听:
日志输出:
【扩展】 :如果合约事件方法包含indexed 参数,那么调用时可以用filter.addOptionalTopics("xxx")方法进行指定数据过滤。但需要注意 索引参数的编码 。
一般索引参数示例:
其他用法示例:
通过http方式监听besu上智能合约的事件
使用web3.js监听besu上的合约事件
使用Web3J与第三方合约交互——批量转账
之前使用NodeJs与智能合约交互,都是访问的自己部署的合约。最近要对线上第三方合约进行转账操作,人数比较多,一笔笔操作起来手指都点断了还容易出错。既然代币Token都遵守ERC20协议,肯定有统一的Transfer(转账)方法供客户端调用,那么编写程序实现自动转账应该可以实现,去查了相关资料发现web3j是不错的选择。
轻量级客户端与以太坊交互的Java库。
既然是调用第三方合约那么肯定需要知道合约地址,合约地址定义了到哪里去访问合约;
ABI(Application Binary Interface): 应用程序二进制接口,定义了智能合约提供的方法功能
若是无法获取到ABI接口,也可以使用solc编译生产bin和abi文件。
(生产代理类时可以指定包路径和类名)
这样一来,便可以使用程序完成批量转账操作。
后来研究发现,使用NodeJs直接调用Web3也可以实现对应功能,不过还是对Java更熟悉一些,就采用了Java的方式。
web3合约交互怎么取消
不可取消。智能合约(Solidity代码)是Web3建设的基础,是搭建去中心化生态的奠基,智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。Web 3 是一些技术人员为使用去中心化区块链(比如比特币和以太坊等加密货币使用的共享账本系统)而构想出的新型互联网。