question archive class Ethereum { constructor () { this
Subject:Computer SciencePrice: Bought3
class Ethereum {
constructor () {
this.engine = new ProviderEngine();
this.web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
//this.web3 = new Web3(this.engine);
//this.utils = new Utils();
this.pendingTransactions = [];
this.addWeb3Commands();
this.initWeb3Provider();
//convert the contracts into usable objects
this.Agent = contract(agentJson);
this.AgentRegistry = contract(agentRegistryJson);
this.Relationship = contract(relationshipJson);
//Provision the contract with a web3 provider
this.Agent.setProvider(this.engine);
this.AgentRegistry.setProvider(this.engine);
this.Relationship.setProvider(this.engine);
//the value stores access to privateKeys and addresses
this.vault = null;
//saves the user password so they don't have to enter it for every transaction
this.pwDerivedKey = null;
}
waitForVault () {
return new Promise((resolve, reject) => {
let check = () => {
if(this.vault && this.pwDerivedKey) {
resolve(this.vault);
}else {
setTimeout(check, 200);
}
};
check();
});
}
waitForRPCConn () {
return new Promise((resolve, reject) => {
let timer;
let check = () => {
this.web3.eth.net.isListening().then(listening => {
if(listening) {
clearTimeout(timer);
resolve();
}
}).catch(() => {});
};
timer = setInterval(check, 2000);
check();
});
}
//add some non standard web3 commands to the web3 api
addWeb3Commands () {
function toStringVal (val) {
return String(val);
}
function toBoolVal (val) {
if(String(val) == 'true') {
return true;
}
return false;
}
function toIntVal (val) {
return parseInt(val);
}
this.web3.extend({
property: 'personal',
methods: [new this.web3.extend.Method({
name: 'unlockAccount',
call: 'personal_unlockAccount',
params: 3,
inputFormatter: [this.web3.extend.utils.toAddress, toStringVal, toIntVal],
outputFormatter: toBoolVal,
})],
});
this.web3.extend({
property: 'personal',
methods: [new this.web3.extend.Method({
name: 'importRawKey',
call: 'personal_importRawKey',
params: 2,
inputFormatter: [this.web3.extend.utils.toAddress, toStringVal],
})],
});
this.web3.extend({
property: 'miner',
methods: [new this.web3.extend.Method({
name: 'start',
call: 'miner_start',
params: 0,
})],
});
}
//initialize the modular Web3 API provider
initWeb3Provider () {
//filters
//this.engine.addProvider(new FilterSubprovider());
//pending nonce
this.engine.addProvider(new NonceSubprovider());
//accounts management
this.engine.addProvider(new HookedWalletSubprovider({
getAccounts: (cb) => {
this.getVault()
.then(vault => {
if(vault) {
cb(null, vault.getAddresses());
}else {
cb('no keys available, login frst', null);
}
});
},
signMessage: (options, cb) => {
this.getVault().then(vault => {
var secretKey = vault.exportPrivateKey(options.from, this.pwDerivedKey);
var msg = new Buffer(options.data.replace('0x', ''), 'hex');
let msgHash = Utils.hashPersonalMessage(msg);
let sgn = Utils.ecsign(msgHash, new Buffer(secretKey, 'hex'));
let signedMsgHex = Utils.bufferToHex(Buffer.concat([
Utils.setLengthLeft(sgn.r, 32),
Utils.setLengthLeft(sgn.s, 32),
Utils.toBuffer(sgn.v),
]));
//Utils.toRpcSig(sgn.v, sgn.r, sgn.s);
cb(null, signedMsgHex);
});
},
signTransaction: (txObject, cb) => {
this.getVault().then(vault => {
txObject.gas = '0x1000000';
txObject.gasLimit = '0x1000000';
let tx = new Transaction(txObject);
let rawTX = tx.serialize().toString('hex');
let signedTx = '0x' + signing.signTx(
}
}
