泰山众筹4.0阿凡达Avatar系统开发技术详细丨泰山众筹4.0阿凡达Avatar系统源码

简介: pragma solidity ^0.4.21;contract TransactionFee {// (1)uint public fee;

pragma solidity ^0.4.21;

contract TransactionFee {

// (1)

uint public fee;

// (2)

address public receiver;

// (3)

mapping (address => uint) public balances;

// (4)

event Sent(address from, address to, uint amount, bool sent);

// (5)

constructor(address _receiver, uint _fee) public {

receiver = _receiver;

fee = _fee;

}

// (6)

function getReceiverBalance() public view returns(uint) {

return receiver.balance;

}

// (7)

function sendTrx() public payable {

uint value = msg.value * fee / 100;

bool sent = receiver.send(value);

balances[receiver] += (value);

emit Sent(msg.sender, receiver, value, sent);

}

}

一旦我们创建了一个合约,我们必须编译并且创建源代码,这样我们才能够在我们的应用中部署合约并调用它的函数。有关 Solidity 编译器的相关信息,可以查阅官方网站:https://remix.ethereum.org

  1. 编译合约并创建源代码

Solidity 为编译器提供了最新的 Docker 镜像,正式版本标记为stable,来自于开发分支的不稳定版本标记为nightly。但是,Docker 镜像只包含编译器可执行文件,因此我们必须将 Solidity 合约输入文件进行持久化卷挂载。假设这些文件在我们运行 Docker 容器机器的目录 /home/docker 下,我们可以使用以下命令进行编译。这个命令创建了两个文件:一个二进制文件 .bin,是 EVM 可以解释的智能合约代码,另外一个是应用程序二进制接口文件.abi,里面定义了智能合约方法。

$ docker run --rm -v /home/docker:/build ethereum/solc:stable /build/TransactionFee.sol --bin --abi --optimize -o /build

编译输出文件在容器的/build目录下,并且持久化存储在/home/docker目录下。在编译结束后,该容器被删除,因为现在不需要它。我们可以使用 web3j 库来从编译后的智能合约文件中创建源代码。web3j 的可执行文件在${WEB3J_HOME}/bin目录下,在创建源代码时,需要指定.bin 和 .abi文件的路径,并且设定目标包名和目录。

$ web3j solidity generate /build/transactionfee.bin /build/transactionfee.abi -p pl.piomin.services.contract.model -o src/main/java/

Web3j 可执行文件在给定的包名下创建了 Java 源文件,该类名为 Solidity 智能合约名,下面是我们创建出来的源代码。

public class Transactionfee extends Contract {

private static final String BINARY = "608060405234801561..."

public static final String FUNC_GETRECEIVERBALANCE = "getReceiverBalance";

public static final String FUNC_BALANCES = "balances";

public static final String FUNC_SENDTRX = "sendTrx";

public static final String FUNC_FEE = "fee";

public static final String FUNC_RECEIVER = "receiver";

// ...

protected Transactionfee(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {

super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit);

}

public RemoteCall getReceiverBalance() {

final Function function = new Function(FUNC_GETRECEIVERBALANCE,

Arrays.asList(),

Arrays.asList(new TypeReference() {}));

return executeRemoteCallSingleValueReturn(function, BigInteger.class);

}

public RemoteCall balances(String param0) {

final Function function = new Function(FUNC_BALANCES,

Arrays.asList(new org.web3j.abi.datatypes.Address(param0)),

Arrays.asList(new TypeReference() {}));

return executeRemoteCallSingleValueReturn(function, BigInteger.class);

}

public RemoteCall sendTrx(BigInteger weiValue) {

final Function function = new Function(

FUNC_SENDTRX,

Arrays.asList(),

Collections.emptyList());

return executeRemoteCallTransaction(function, weiValue);

}

public RemoteCall fee() {

final Function function = new Function(FUNC_FEE,

Arrays.asList(),

Arrays.asList(new TypeReference() {}));

return executeRemoteCallSingleValueReturn(function, BigInteger.class);

}

public RemoteCall receiver() {

final Function function = new Function(FUNC_RECEIVER,

Arrays.asList(),

Arrays.asList(new TypeReference

() {}));
return executeRemoteCallSingleValueReturn(function, String.class);

}

public static RemoteCall deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit, String _receiver, BigInteger _fee) {

String encodedConstructor = FunctionEncoder.encodeConstructor(Arrays.asList(new org.web3j.abi.datatypes.Address(_receiver),

new org.web3j.abi.datatypes.generated.Uint256(_fee)));

return deployRemoteCall(Transactionfee.class, web3j, credentials, gasPrice, gasLimit, BINARY, encodedConstructor);

}

public static RemoteCall deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit, String _receiver, BigInteger _fee) {

String encodedConstructor = FunctionEncoder.encodeConstructor(Arrays.asList(new org.web3j.abi.datatypes.Address(_receiver),

new org.web3j.abi.datatypes.generated.Uint256(_fee)));

return deployRemoteCall(Transactionfee.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, encodedConstructor);

}

相关文章
|
开发框架 算法 前端开发
一位.Net开发工程师的客户端技术栈的学习路线
从2018年硕士毕业后,我一直从事着.Net开发工作,趁着CSDN这次活动,给大家分享一下.Net客户端领域的技术栈的学习路线,这个学习路线,涵盖的是比较基础的内容,适合刚入门.Net的萌新学习和刚进入职场的毕业生查漏补缺,然后这个博文比较受大家的欢迎的话,后续可能会考虑出一个更详细的版本。致敬我彻夜学习的.Net。
一位.Net开发工程师的客户端技术栈的学习路线
基于宜搭的“企业报销流程”实践案例
报销是一个企业的典型场景,本案例着重讲述一个典型的财务报销流程的搭建,已介绍宜搭流程相关的核心功能。报销由员工发起申请,填写报销项以及对应的详情信息,发起审批流程。审批流程计划设置为:当前提交人主管,审批人所在部门对应的财务接口人,财务总监(如果金额大于10000元,则需要加入该角色)
基于宜搭的“企业报销流程”实践案例
|
12月前
|
机器学习/深度学习 自动驾驶 算法
深度学习在图像识别中的应用与发展
本文将深入探讨深度学习技术在图像识别领域的应用,通过案例分析展示其最新进展。我们将从基本原理出发,了解深度学习如何改变图像处理和识别的方式,并展望其未来可能的发展方向。
|
10月前
|
人工智能 自然语言处理 并行计算
Maya:基于 LLaVA 开发的多模态小模型,能理解和处理八种语言,适用于低资源环境
Maya 是一个开源的多语言多模态模型,能够处理和理解八种不同语言,包括中文、法语、西班牙语、俄语、印地语、日语、阿拉伯语和英语。该模型基于LLaVA框架,通过指令微调和多语言数据集的预训练,提升了在视觉-语言任务中的表现,特别适用于低资源语言的内容生成和跨文化理解。
383 16
Maya:基于 LLaVA 开发的多模态小模型,能理解和处理八种语言,适用于低资源环境
|
机器学习/深度学习 人工智能 自然语言处理
AI技术在自然语言处理中的应用
【10月更文挑战第4天】本文将介绍人工智能(AI)在自然语言处理(NLP)领域的应用,包括语音识别、机器翻译、情感分析等方面。我们将通过一些实际案例展示AI如何帮助人们更好地理解和使用自然语言。同时,我们也会探讨AI在NLP领域面临的挑战和未来发展方向。
|
JavaScript 前端开发 编译器
Cmake 中 compiler_depend.ts 文件:解析和使用 C/C++ 预编译头文件
Cmake 中 compiler_depend.ts 文件:解析和使用 C/C++ 预编译头文件
312 1
|
12月前
|
机器学习/深度学习 算法
神经网络的结构与功能
神经网络是一种广泛应用于机器学习和深度学习的模型,旨在模拟人类大脑的信息处理方式。它们由多层不同类型的节点或“神经元”组成,每层都有特定的功能和责任。
773 0
|
12月前
|
存储 机器学习/深度学习 安全
小微企业的如何使用云计算帮助企业节约成本?
小微企业的如何使用云计算帮助企业节约成本?
|
传感器 物联网 大数据
[总结]蓝牙各个版本的关系和区别
[总结]蓝牙各个版本的关系和区别
2147 0
|
存储 运维 算法
关于innodb中查询的定位方法
原创转载请注明出处 源码版本 5.7.14 涉及源码文件 page0cur.cc page0page.h page0page.cc rem0cmp.cc 为什么谈及定位方法,因为在innodb中,比如一个插入语句我们需要定位在哪里插入(PAGE_CUR_LE),比如一个查询语句我们需要定位到其第一个需要读取数据的位置,因此定位方法是查询的根本。
1610 0