Web3j实现智能合约

区块链技术Butterfly2018-01-23 22:28:09  阅读 -评论 1  阅读原文

芯链团队

本文主要是针对有兴趣进行以太坊智能合约开发的技术爱好者,进行开发和调试

1 获取凭证

Credentials是我们钱包的凭证,在我们交易和创建智能合约的时候都需要用到。

1.1 创建新凭证

file=WalletUtils.generateFullNewWalletFile(pwd,dir);

返回的file不是全路径,而是该文件的路径名,比如UTC--2017-10-30T12-10-45.516005546Z--5f38056f45091ee992298e53681b0a60c999ff95。

前面的是创建时间,后面的是账号标识。

1.2 使用旧凭证

每个账号在创建的时候都会生成一个keystore,它是Json格式的。如果要使用旧凭证,首先需要找到我们的keystore。我这里的服务器搭建在linux服务端,所以这里把keystore拷贝到我们windows本地。

然后生成credentials

2 智能合约

2.1 编写智能合约

以太坊编写智能合约有三种语言:

  • Serpent

Serpent是一种类似于Python的语言,可用于开发契约并编译为EVM字节码。它旨在最大限度地简化和清理,将低级语言的许多效率优势与易于使用的编程风格相结合,同时为合同编程添加特定领域特定功能。蛇是使用LLL编译的。

  • Solidity

这是一种类似于JavaScript的语言,它允许你开发合同并编译为EVM字节码。它目前是以太坊的旗舰语言,也是最受欢迎的。

我们这里编写一份Hello World

contract HelloWorld

{

address creator;

string greeting;

function HelloWorld(string _greeting) public

{

creator = msg.sender;

greeting = _greeting;

}

function greet() constant returns (string)

{

return greeting;

}

function setGreeting(string _newgreeting)

{

greeting = _newgreeting;

}

/**********

Standard kill() function to recover funds

**********/

function kill()

{

if (msg.sender == creator)

suicide(creator); // kills this contract and sends remaining funds back to creator

}

}

  • LLL

Lisp Like Language(LLL)是一种类似于Assembly的低级语言,它意味着非常简单和简约,基本上就是直接在EVM中进行编码的一个小包装。

还有一种已经被弃用了,这里我们选用官方标准的Solidity语言编写。

2.2 编译智能合约

这里使用Solidity的在线编译器https://ethereum.github.io/browser-solidity/

把我们上面编写好的智能合约代码贴进去。

然后点击Details。

这里的name就是智能合约的名称,ABI文件会暴露合同的所有构造参数,我们需要用ABI文件生成java类。WEB3是生成好的js文件,可以配合web3.js直接调用。

2.3 Solidity类转换成java类

如果想要避免使用智能合约的底层实现细节,web3j提供了Solidity 智能合约包装,使您可以通过生成的包装对象直接与所有智能合约的方法进行交互。

这里我们把ABI文件复制一下,然后粘贴到本地作为.json文件,名字最好和类名一样,比如我这里叫HelloWorld.json。这里有一个大坑,就是编译器生成的JSON文件格式不对,没有合约名字,如果我们执行转换会报错。

这里我们打开json文件手动编译一下

web3j支持从Solidity ABI文件在Java中自动生成智能合约函数包装器。

web3j 命令行工具附带一个用于生成智能合同函数包装器的命令行工具:

先去官方下载一个命令行工具

https://github.com/web3j/web3j/releases/tag/v3.2.0

下载.zip文件解压到本地。

找到web3.bat文件执行 $ web3j truffle generate [--javaTypes|--solidityTypes] /path/to/<truffle-smart-contract-output>.json -o /path/to/src/main/java -p com.your.organisation.name

上面这个是官方的格式不太通俗易懂,我给大家翻译一下:

Web3j truffle generate json文件地址 -o 生成的文件目录 -p 生成的文件包名。这里要注意 -o 和-p也要带上。

如果web3.bat文件点不开,就直接使用cmd命令执行,在执行的时候带上web3j的全路径就行了,执行完成之后控制条会显示:

或者也可以通过Java类进行调整,添加web3j的相关依赖,然后使用maven指定运行。

这里把生成好的java类拷贝到我们的代码里面。

2.4 发布智能合约

合约生效时间

private static final String BINARY =null;

这个BINARY代表智能合约的生效时间,生成的类里面默认是NULL. 如果不修改这个时间执行智能合约默认是失效的,所以这里我们修改一下为官方指定的二进制代码。

在编译器里面也可以看到我们生成的合约二进制文件。

当然这也不代表合同会永久生效,因为我们在发布合同的时候会指定要消耗的gas和gaslimit.

部署智能合约

//部署智能合约

HelloWorld contract=deploy(admin, credentials,ManagedTransaction.GAS_PRICE, Contract.GAS_LIMIT,"Hello,World").send();

部署合约需要消耗Gas.这里说一下我对以太坊Gas的理解:

交易的过程一般需要支付一定量的手续费(当然也可以选择不支付)。矿工会优先打包交易手续费高的交易,如果没有支付交易手续费,你的交易可能要等很久才会被打包。创建一笔交易的时候不需要显式的指明支付多少交易手续费,它是根据你的 UTXO额 - 交易额 - 找零 来计算的。举个栗子,A有一个10btc的UTXO(未花费的交易输出)的支配权,它给B账户转1BTC,那么在创建交易的时候,需要指明交易额1btc,和找零8.995,那么(10-8.995-1 = 0.005)就是这笔交易的手续费,会奖励给打包包含这笔交易的区块的矿工,如果没有设置找零那么多余的9btc都会被当作交易手续费奖励给矿工,虽然你的交易会很快的被打包,但是这可能不是你想要的。

  • 这样可以鼓励更加高效的合约代码,减少不必要的计算,避免系统遭受攻击,毕竟攻击者要为他们消耗的资源付出一定的代价,包括带宽,CPU,和存储。
    gasPrice 是由交易的发起者来设置的,但是矿工可以选择先打包那些gas价格高的交易,gas价格低的可能要等很久或者不会被打包。
  • 例如一笔交易:{ from:web3.eth.accounts[0], data:tokenCompiled.token.code, gas: 1000000 }, gas参数设置这个交易最多能使用多少gas。交易里面还可以再加一个参数gasPrice,gasPrice可以自己设置, geth会默认设置一个大多数矿工可以接受的 gasPrice, 0.05e12 wei,可以调eth.gasPrice来查看当前的gasPrice.
  • 矿工在启动geth的时候可以设置两个参数--ask 和 --bid , --ask是设置一个最低的gas价格,低于这个价格的交易会被忽略,默认值是500000000000,--bid 设置gas价格竞价,默认值是 500000000000。

合约地址

//获取合约地址

String contractAddress = contract.getContractAddress();

合约发布成功之后会在ETH客户端生成一个合约地址,我们在以后调用的时候都需要用到。

验证合同是否有效

使用这种方法,您可能需要确定已经加载的合同地址是您期望的智能合约。为此,您可以使用isValid智能合约方法,只有在合约地址已部署字节码与智能合约包装中的字节码匹配时才会返回true.

System.out.println(contract.isValid());

如果返回false,可能是因为智能合约代码生成的有问题,也有可能是合同生效时间没有设置。

加载智能合约

如果我们想使用已经部署过的智能合约,这个时候我们就需要加载智能合约了,

在加载智能合约的时候你需要拥有该智能合约的地址。

HelloWorld contract =HelloWorld.load(contractAddress,admin,credentials, GAS_PRICE, GAS_LIMIT);


调用智能合约

String value=contract.greet().send();

log.info(value);

调用我们编译好的get方法,会在控制台打印Hello World。代表我们这次合约部署调用成功。

销毁智能合约

contract.kill();

销毁后的智能合约无法调用,但是可以查询到。

HPB芯链团队

【HPB芯链】

立即加入我们的电报群:https://t.me/hpbfans

最新资讯将在群内同步实时更新!芯链团队正在等待你的到来!

声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们100@7234.cn

参与讨论 (1 人参与讨论)

相关推荐

区块链应用案列:一度店——利用区块链技术加速新能源转型

目前,区块链在能源领域应用已开始初见端倪,区块链技术核心功能就是保障数据的真实可信,打破信任壁垒,极大降低了能源业务开展需要支付的信任成本,促进业务的高效开展。席卷热潮的发热体——区块链商品交易速度是经济发展的本质驱动力农业社会,由于商品的产量和运输的局限,商品的交易速度极为不便,经济的活跃度很有限,整个农业社会发展用了将近2000年的时间过渡到工业社会;工业社会,汽车、火车、轮船、飞机开始涌现,

区块链投资趋势报告:巨头入场布局行业趋于成熟

区块链投资趋势报告:巨头入场布局行业趋于成熟

来自:https://mp.weixin.qq.com/s?__biz=MzI4NzIxOTY1NA==&amp;mid=2650632639&amp;idx=1&amp;sn=e6d1c29731d992a80410aaee82ec3ea6&amp;chksm=f3d8db16c4af520097e4a64a71b1d4743ac326b9f027

重新发明货币

重新发明货币

一、货币的演化过程 先简单回顾一下人类货币的演化过程,大概有以下阶段: a. 1.0版本:自然货币(贝壳、牲口、金银……) 这个阶段,货币基于一般等价物的稀有性或者实用性,货币不可能出现人为操纵的超发。 b. 2.0版本:早期纸币、银票到本位纸币 当贸易量越来越大,实物货币太不方便了,而且大家发现其实并不在意货币本身有什么价值,在意的只是这么多的货币能不能交换到足够的物品,于是纸币这种信用货

从比特币交易看欧洲央行虚拟货币分类

从比特币交易看欧洲央行虚拟货币分类

  互联网对传统社会的颠覆从未停止,在其完成对信息流、商流、物流、资金流的初步改造之后,或将以虚拟货币的形式打破现有货币体系   4月18日,在中国极客张沈鹏创办的比特币交易平台(42BTC.com)上,比特币对人民币的平均交易价为576元。当天,该平台完成了100个比特币的交易量。仅仅过去一周,4月25日上午,比特币对人民币的平均交易价已达到906元。据42BTC网站统计:在过去的32个月

欧洲央行-比特币报告

3.1 比特币 3.1.1 基本特征          比特币可能是最成功的,也可能是最有争议的虚拟货币方案,由日本程序员中本聪(译者注:事实上,中本聪是不是日本人,甚至是不是单个人无从考证)在2009年设计并实现。该计划基于一个类似于BitTorrent的P2P网络。BitTorrent是互联网上著名的共享文件协议,应用在电影,游戏和音乐领域。比特币在全球层面上运作,可用于各类货币交易(虚

彻底玩转比特币地址和私匙

彻底玩转比特币地址和私匙

比特币地址和私匙是所有比特币初学者面对的一大难题,再加上那一串超长的字符串,让人更是摸不到头脑。 现在编者以问答的形式,带你一步步的揭开比特币地址和私匙的面纱。 还不知道什么是比特币地址和私匙的同学请点这里 问题一、比特币钱包由什么组成? 答 我们知道,比特币地址和私匙组成了比特币钱包,而私匙则决定了比特币地址上比特币的归属。 地址和私匙 问题二、如果只记得私匙我们还能还原比特币地址么? 答

用GO语言实现比特币算法

用GO语言实现比特币算法

本节的这个例子展示一点点高精度数学包math/big、一点点散列包hash、一点点加密包crypto,还有一点点测试包testing的知识。这里不介绍bitcoin协议和算法——尽管它们很有趣,而是试图指出,Go对多种操作系统的支持,是实现这种跨平台应用的理想语言。 位钱(bitcoin)是一种使用加密手段制作的分布式电子货币。它最初于1998年由Wei Dai提出,并由中本聪(Satoshi

详解比特币的找零机制

详解比特币的找零机制

比特币的找零机制一直让人有些迷惑,明明只向一个地址发送了比特币为什么 blockchain 上面的显示的有时是1个地址对多个地址,有时是多个地址对1个地址,有时又显示多个地址对多个地址? 为什么比特币资深用户要提醒大家当比特币钱包交易100次以上时再次交易后要重新备份钱包,恢复以前的钱包备份有可能会遭遇损失? 是的,这一切都是因为比特币的找零(Change)机制。本文参考 Bitcoin的维

麦妖榜
更新日期 2019-01-17
排名用户贡献值
1等待的宿命23695
2BitettFan23632
3六叶树20309
4天下无双16192
5lizhen00214782
6区块大康14502
7让时间淡忘14188
8冷风大q11188
9momo11174
10linjm122710573
返回顶部 ↑