区块链技术(12):Web3j实现智能合约
1?马鞭获取凭证
凭证是我们钱包的凭证,当我们交易和创建智能合约时需要它。
?
1.1?创建新凭证
file=WalletUtils。GenerateFullNewWalletFile (pwd,dir);
返回的文件不是完整路径,而是文件的路径名,如UTC2017-10-30t 12-10-45.516005546 z5f 38056 f 45091 e 992298 e 53681 b 060 c 999 ff 95。
前面是创建时间,后面是账号ID。
?
1.2?使用旧凭证
每个帐户将在创建时生成一个密钥库,其格式为Json。如果您想使用旧凭证,您需要首先找到我们的密钥库。我的服务器构建在linux服务器上,所以我将密钥库复制到我们的本地windows。
蓑衣网小编2022
然后生成凭证
2?马鞭马鞭马鞭智能合约2.1?编写智能合约以太坊编写智能合约有三种语言:SerpentSerpent是一种类似Python的语言,可以用来开发合约,并将其编译成EVM字节码。它旨在最大程度地简化和清理,将低级语言的许多效率优势与易于使用的编程风格结合起来,同时将特定领域的功能添加到契约编程中。蛇是用LLL编译的。Solidity这是一种类似JavaScript的语言,允许你开发契约,并把它们编译成EVM字节码。它是目前以太坊的旗舰语言,也是最受欢迎的。我们来写一份Hello World
契约Hello World
{
?马鞭马鞭地址创建器;?马鞭马鞭串问候;??马鞭马鞭函数hello world(string _ greeting)public?马鞭马鞭{?马鞭马鞭马鞭马鞭马鞭马鞭马鞭creator=msg.sender?马鞭马鞭马鞭马鞭马鞭马鞭马鞭问候语=_问候语;?马鞭马鞭}??马鞭马鞭函数greet()常量返回(string)?马鞭马鞭{?马鞭马鞭马鞭马鞭马鞭马鞭马鞭回礼问候;蓑衣网小编2022?马鞭马鞭}??马鞭马鞭函数set greeting(string _ new greeting)?马鞭马鞭{?马鞭马鞭马鞭马鞭马鞭马鞭马鞭问候语=_ newgreeting?马鞭马鞭}??马鞭马鞭马鞭/**********?马鞭马鞭马鞭标杀()函数回收资金?马鞭马鞭马鞭*********/??马鞭马鞭功能kill()?马鞭马鞭{?马鞭马鞭马鞭马鞭马鞭马鞭if (msg.sender==creator)?马鞭马鞭马鞭马鞭马鞭马鞭马鞭马鞭马鞭马鞭马鞭马鞭自杀(创作者);马鞭//杀死本契约,将剩余资金送回创作者?马鞭马鞭}}?LLLLISP LIKE LANGUAGE(LLL)是一种类似于汇编的低级语言,意思是非常简单简洁,基本上就是一个直接在EVM编码的小软件包。还有一个被抛弃了。这里我们选择官方标准的Solidity语言来写。?2.2?马鞭马鞭马鞭编译智能合约这里我们用Solidity的在线编译器https://ether eum . github . io/browser-Solidity/来粘贴我们上面写的智能合约代码。然后单击详细信息
此处的名称是智能合约的名称。ABI文件将暴露合同的所有施工参数。我们需要使用ABI文件来生成java类。WEB3是生成的js文件,可以用web3.js
直接调用?2.3?Solidity类转换成java类如果想避免使用智能合约的底层实现细节,web3j提供了Solidity?智能协定包装使您能够通过生成的包装对象直接与智能协定的所有方法进行交互。?在这里,我们复制ABI文件,然后将其作为. json文件粘贴到本地。该名称应该与类名相同。比如我这里叫HelloWorld.json。这里有一个很大的漏洞,就是编译器生成的JSON文件格式错误,没有契约名。如果我们执行转换,我们将报告一个错误。这里我们打开json文件,手动编译
Web3J支持从Solidity ABI fil用Java自动生成智能合约函数包装器
找到web3.bat文件,执行$ web 3j truffle generate[-Java types |-solidity types]/path/to/。JSON-o/path/to/src/main/Java-pcom . your . organization . name
上面那个是官方的格式,不太好理解。我来给你翻译一下:
Web3j truffle生成json文件地址-o生成文件目录-p生成文件包名。这里注意-o和-p也要带。
如果web3.bat文件没有打开,就用cmd命令执行。执行的时候,带上web3j的完整路径就可以了。执行后,控制栏会显示:
。或者,可以通过Java类进行调整,添加web3j的相关依赖项,然后使用maven指定运行。
在这里,将生成的java类复制到我们的代码中。?2.4?发布智能合约
合约生效时间
私有静态最终字符串binary=null
这个二进制表示智能合约的生效时间,生成的类默认为NULL。如果这个时间不修改,执行智能合约默认无效,所以这里我们修改为官方指定的二进制代码。
在编译器中,还可以看到我们生成的契约二进制文件。就是这条线。我们就抄吧。马鞭
部署智能合约hello world contract=deploy(admin,credentials,managedtransaction.gas _ price,contract.gas _ limit,“hello,world”)。send();部署合同需要消耗天然气。下面是我对以太坊气的理解:交易的过程一般需要支付一定的手续费(当然你也可以选择不支付)。矿商会优先考虑打包交易,交易费用高。如果没有支付交易费用,您的交易可能需要等待很长时间才能打包。创建交易时,不需要明确指出要支付多少交易费。根据你的UTXO金额-交易金额-零钱计算。以栗子为例。a拥有10btc的UTXO(未支出交易输出)控制权,其向账户b转账1BTC,创建交易时需要注明1btc的交易金额和8.995的变化。那么(10-8.995-1=0.005)就是本次交易的手续费,将奖励给打包包含本次交易的区块的矿工。-这可以鼓励更有效的契约代码,减少不必要的计算,并避免系统攻击。毕竟,攻击者必须为他们消耗的资源付出一定的代价,包括带宽、CPU和存储。-汽油价格?由交易发起方设定,但矿商可以选择先打包那些气价高的交易,气价低的可能要等很久或者不打包。-比如一笔交易:{from: web3.eth.accounts [0],data: tokencompleted.token.code,gas:1000000 }。gas参数设置可在此交易中使用的气体的最大数量。还可以在交易中添加另一个参数gasPrice,可以自己设置。geth会默认设置一个大多数矿商都能接受的gasPrice,0.05e12卫,你可以调整eth.gasPrice查看当前的gasPrice。-矿工可以设置两个参数——要价和——出价?要求设定最低天然气价格。低于此价格的交易将被忽略。默认值为50000000000。-bid设置气价竞价,默认值为5000000000。
?约定地址string contract address=contract . getcontract address();合同发布成功后,ETH客户端会生成一个合同地址,我们以后调用时会用到。
?
验证契约是否有效
使用这种方法,您可能需要确保已经加载的契约的地址是您期望的智能契约。为此,您可以使用isValid智能协定方法,只有当协定地址的已部署字节码与智能协定包装器中的字节码匹配时,该方法才会返回true。
system . out . println(contract . is valid());
如果返回false,可能是因为智能合同代码的生成有问题,或者合同的生效时间没有设置。
?
加载智能合约
如果我们想要使用已部署的智能合约,这就是我们需要加载智能合约的时候,
加载时您需要有智能合约的地址。
hello world contract=hello world . load(contract address,admin,credentials,GAS_PRICE,GAS _ LIMIT);
?
调用智能合约
字符串值=contract.greet()。send();
log.info(值);
调用我们编译的get方法将在控制台上打印Hello World。代表我们成功部署了这份合同。
?
销毁智能合约
contract . kill();
销毁的智能合约不能调用,但可以查询。
?
HPB核心链团队
?
?王小明简介:[X][X]HPB芯链创始人,十余年金融大数据和区块链技术开发经验蓑衣网小编2022,曾参与银联大数据创建。创作了30多期区块链教学视频节目《明说》,编译《以太坊官网文档中文版》,作为主要作者,编译《区块链开发指南》,在中国区块链社区被誉为ID“蓝莲花”。