{
"config":{
"chainId":15,
"homesteadBlock":0,
"eip155Block":0,
"eip158Block":0
},
"difficulty":"4",
"gasLimit":"2100000",
"alloc":{ }
}
geth init genesis.json --datadir dataChain
<1>错误1:pcscd服务错误
如果初始化节点过程中报以下错误:
INFO [11-09|17:23:10.229] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
则后面会挖不出来矿,需要安装pscd服务
sudo apt-get -y install libusb-dev
sudo apt-get -y install pcscd
<2>错误2:创世文件block
如果初始化节点过程中报以下错误:
Fatal: Failed to write genesis block: unsupported fork ordering: eip150Block not enabled, but eip155Block enabled at 0
则修改创世文件block号150和155:
"eip150Block": 0,
"eip155Block": 0
# geth --networkid 123 --datadir dataChain --rpc --rpcaddr 127.0.0.1 --rpcport 8545 --port 3000 --allow-insecure-unlock
备注:
# cd dataChain
# geth attach ipc:geth.ipc
# geth attach ipc:geth.ipc
> personal.listAccounts
[]
> personal.newAccount("123456")
"0x0f6740d209db6ed6b12c70daf667340cd06c5611"
> personal.listAccounts
["0x0f6740d209db6ed6b12c70daf667340cd06c5611"]
> eth.getBalance(personal.listAccounts[0])
0
> miner.setEtherbase(personal.listAccounts[0])
true
> miner.start()
null
> miner.stop()
null
> eth.getBalance(personal.listAccounts[0])
35000000000000000000
说明:
<1> 首次挖矿需要等待较长时间
pragma solidity ^0.4.4;
contract CheckContract {
function check(string attributeA, string attributeB) pure public returns(bool){
if(bytes(attributeA).length != bytes(attributeB).length){
return false;
}else{
return keccak256(bytes(attributeA)) == keccak256(bytes(attributeA));
}
}
}
# 编译合约,生成bin文件
solc --bin CheckContract.sol -o ./
# 编译合约,生成abi文件
solc --abi CheckContract.sol -o ./
// web3j 根据bin文件和abi文件生成Java合约类
web3j solidity generate --javaTypes --binFile=CheckContract.bin --abiFile=CheckContract.abi -o ./ --package='myContract'
#! dataChainClient
# 合约bin赋值,拷贝.bin文件里的值
# 记得在.bin文件的值之前加 0x
>var publicBinCode="0x608060405234801561001057600080fd5b50610227806100206000396000f300608060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063725dbc4014610046575b600080fd5b34801561005257600080fd5b506100f3600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061010d565b604051808215151515815260200191505060405180910390f35b60008151835114151561012357600090506101f5565b816040518082805190602001908083835b6020831015156101595780518252602082019150602081019050602083039250610134565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916836040518082805190602001908083835b6020831015156101c0578051825260208201915060208101905060208303925061019b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019161490505b929150505600a165627a7a7230582096b45b9571ed5dacf868e454b6330fa960d7099f595bd758e940a49bd7ec68790029"
# 合约 abi赋值
>var publicAbiCode=[{"constant":true,"inputs":[{"name":"attributeA","type":"string"},{"name":"attributeB","type":"string"}],"name":"check","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"}]
# 解锁挖矿账户
> personal.unlockAccount(personal.listAccounts[0])
Passphrase: // 输入创建账户时,括号里的参数,即账户的密码,"123456"
Unlock account 0x449f09d90a4726db78b86972528fc99ea00777d8
# 预估gas
> eth.estimateGas({data:publicBinCode})
199867
> var publicAbiContract=eth.contract(publicAbiCode)
undefined
> var publicContract=publicAbiContract.new({from:personal.listAccounts[0],data:publicBinCode,gas:200000})
undefined
# 开始挖矿
> miner.start()
> miner.stop()
# 查看合约
> publicContract
{
abi: [{
constant: true,
inputs: [{...}, {...}],
name: "check",
outputs: [{...}],
payable: false,
stateMutability: "pure",
type: "function"
}],
address: "0x291f3347f9cb6d58ca9c24b61f87bf2348b15d2f",
transactionHash: "0xf9cbfcf8027a085106855eb31b1e10368b63bca177c2b9fffe9131d179bf061b",
allEvents: function(),
check: function()
}
> publicContract.address
"0x291f3347f9cb6d58ca9c24b61f87bf2348b15d2f"
<1>错误:无法解锁挖矿账户
如果解锁账户过程中报以下错误:
account unlock with HTTP access is forbidden
因为新版本geth,出于安全考虑,默认禁止了HTTP通道解锁账户,解决办法是在启动服务端时加上参数
--allow-insecure-unlock
# 完整的启动命令
geth --networkid 123 --datadir dataChain --rpc --rpcaddr 127.0.0.1 --rpcport 8545 --port 3000 --allow-insecure-unlock
注意事项:
package access.contract; import java.math.BigInteger; import java.util.Arrays; import org.web3j.abi.TypeReference; import org.web3j.abi.datatypes.Bool; import org.web3j.abi.datatypes.Function; import org.web3j.abi.datatypes.Type; import org.web3j.crypto.Credentials; import org.web3j.protocol.Web3j; import org.web3j.protocol.core.RemoteCall; import org.web3j.tx.Contract; import org.web3j.tx.TransactionManager; import org.web3j.tx.gas.ContractGasProvider; /** *
Auto generated code. *
Do not modify! *
Please use the web3j command line tools, * or the org.web3j.codegen.SolidityFunctionWrapperGenerator in the * codegen module to update. * *
Generated with web3j version 4.3.0. */ public class CheckContract extends Contract { private static final String BINARY = "608060405234801561001057600080fd5b50610227806100206000396000f300608060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063725dbc4014610046575b600080fd5b34801561005257600080fd5b506100f3600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061010d565b604051808215151515815260200191505060405180910390f35b60008151835114151561012357600090506101f5565b826040518082805190602001908083835b6020831015156101595780518252602082019150602081019050602083039250610134565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916836040518082805190602001908083835b6020831015156101c0578051825260208201915060208101905060208303925061019b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019161490505b929150505600a165627a7a72305820780ddfaae258de09943d9399c67ea187c86272e789ea36798919fc34edf3656b0029"; public static final String FUNC_CHECK = "check"; @Deprecated protected CheckContract(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit); } protected CheckContract(String contractAddress, Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) { super(BINARY, contractAddress, web3j, credentials, contractGasProvider); } @Deprecated protected CheckContract(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit); } protected CheckContract(String contractAddress, Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) { super(BINARY, contractAddress, web3j, transactionManager, contractGasProvider); } public RemoteCall
check(String attributeA, String attributeB) { final Function function = new Function(FUNC_CHECK, Arrays. asList(new org.web3j.abi.datatypes.Utf8String(attributeA), new org.web3j.abi.datatypes.Utf8String(attributeB)), Arrays. >asList(new TypeReference () {})); return executeRemoteCallSingleValueReturn(function, Boolean.class); } @Deprecated public static CheckContract load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { return new CheckContract(contractAddress, web3j, credentials, gasPrice, gasLimit); } @Deprecated public static CheckContract load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { return new CheckContract(contractAddress, web3j, transactionManager, gasPrice, gasLimit); } public static CheckContract load(String contractAddress, Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) { return new CheckContract(contractAddress, web3j, credentials, contractGasProvider); } public static CheckContract load(String contractAddress, Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) { return new CheckContract(contractAddress, web3j, transactionManager, contractGasProvider); } public static RemoteCall deploy(Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) { return deployRemoteCall(CheckContract.class, web3j, credentials, contractGasProvider, BINARY, ""); } @Deprecated public static RemoteCall deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { return deployRemoteCall(CheckContract.class, web3j, credentials, gasPrice, gasLimit, BINARY, ""); } public static RemoteCall deploy(Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) { return deployRemoteCall(CheckContract.class, web3j, transactionManager, contractGasProvider, BINARY, ""); } @Deprecated public static RemoteCall deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { return deployRemoteCall(CheckContract.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, ""); } }
public class Web3JClient {
// 启动区块链服务端时的 rpcaddr 和 rpcport 参数,如果没有使用了其他参数,则需要在这里修改
private static String url = "http://127.0.0.1:8545/";
private Web3JClient() {
}
private volatile static Web3j web3j;
public static Web3j getClient() {
if (web3j == null) {
synchronized (Web3JClient.class) {
if (web3j == null) {
web3j = Web3j.build(new HttpService(url));
}
}
}
return web3j;
}
}
public class ContractService {
private static Web3j web3j = Web3JClient.getClient();
/**
* 调用合约的方法
*/
public static Boolean publicCheck(String contractAddress, String subAttribute, String objAttribute) {
try {
// 获取第一个账户
String minerBaseAccount = web3j.ethAccounts().send().getAccounts().get(0);
Credentials credentials = Credentials.create(minerBaseAccount);
// 合约对象
CheckContract checkContract = CheckContract.load(contractAddress, web3j, credentials, Contract.GAS_PRICE, Contract.GAS_PRICE);
return checkContract.check(subAttribute, objAttribute).send();
} catch (Exception e) {
System.out.println("exception");
return null;
}
}
}