move to using go contract + go server

based on contracts found here: https://github.com/loomnetwork/tiles-chain
This commit is contained in:
Barry Gitarts 2018-08-11 17:52:45 -04:00
parent 3f409ae7af
commit 2c948dbdac
5 changed files with 358 additions and 8 deletions

45
app/client_contractgo.js Normal file
View File

@ -0,0 +1,45 @@
import {
NonceTxMiddleware, SignedTxMiddleware, Client,
Contract, Address, LocalAddress, CryptoUtils
} from 'loom-js'
import { TileMapState, TileMapTx } from './proto/dots_pb'
export default class ContractClient {
constructor() {}
async createContract() {
const privateKey = CryptoUtils.generatePrivateKey()
const publicKey = CryptoUtils.publicKeyFromPrivateKey(privateKey)
const client = new Client(
'default',
'wss://draw.status.im/websocket',
'wss://draw.status.im/queryws',
)
// required middleware
client.txMiddleware = [
new NonceTxMiddleware(publicKey, client),
new SignedTxMiddleware(privateKey)
]
// address of the `TileChain` smart contract on the Loom DAppChain
const contractAddr = await client.getContractAddressAsync('TileChain')
this.callerAddress = new Address(client.chainId, LocalAddress.fromPublicKey(publicKey))
this.contract = new Contract({
contractAddr,
callerAddr: this.callerAddress,
client
})
}
async setTileMapState(data) {
const setTileMapState = new TileMapTx()
setTileMapState.setData(data)
await this.contract.callAsync('SetTileMapState', setTileMapState)
}
async getTileMapState() {
return await this.contract.staticCallAsync('GetTileMapState', new TileMapState(), new TileMapState())
}
}

View File

@ -322,6 +322,7 @@ class SketchFieldDemo extends React.Component {
id='lineColor' color={this.state.lineColor}
onChange={(color) => this.setState({lineColor: color.hex})}/>
</CardContent>
<Button onClick={this.props.request}>Get Content</Button>
</Card>
</div>
</div>

View File

@ -5,7 +5,8 @@ import EmbarkJS from 'Embark/EmbarkJS';
import SNT from 'Embark/contracts/SNT';
import Web3Render from './components/standard/Web3Render';
import DrawField from './components/draw/DrawField';
import ContractClient, { createContract } from './contract_client'
//import ContractClient, { createContract } from './contract_client'
import ContractClient from './client_contractgo'
window['SNT'] = SNT;
import './dapp.css';
@ -34,7 +35,8 @@ class App extends React.Component {
async createContract() {
const { tileStateUpdateHandler } = this;
this.contractClient = await createContract(tileStateUpdateHandler);
this.contractClient = await new ContractClient();
await this.contractClient.createContract();
this.requestUpdateTilesOnCanvas();
}
@ -45,15 +47,17 @@ class App extends React.Component {
}
async requestUpdateTilesOnCanvas() {
const tileMapState = await this.contractClient.methods.GetTileMapState().call()
if (tileMapState) {
const canvasState = JSON.parse(tileMapState);
const tileMapState = await this.contractClient.getTileMapState()
const tileData = tileMapState.getData()
debugger
if (tileData) {
const canvasState = JSON.parse(tileData);
this.setState({ canvasState });
}
}
setTileMapState = async (data) => {
await this.contractClient.methods.SetTileMapState(data).send()
await this.contractClient.setTileMapState(JSON.stringify(data))
}
setAccount(_account){
@ -73,7 +77,7 @@ class App extends React.Component {
const { web3Provider, loading, canvasState } = this.state;
return (
<Web3Render ready={web3Provider}>
<DrawField setTileMapState={setTileMapState} canvasState={canvasState} />
<DrawField setTileMapState={setTileMapState} canvasState={canvasState} request={this.requestUpdateTilesOnCanvas.bind(this)}/>
</Web3Render>
);
}

300
app/proto/dots_pb.js Normal file
View File

@ -0,0 +1,300 @@
/**
* @fileoverview
* @enhanceable
* @suppress {messageConventions} JS Compiler reports an error if a variable or
* field starts with 'MSG_' and isn't a translatable message.
* @public
*/
// GENERATED CODE -- DO NOT EDIT!
var jspb = require('google-protobuf');
var goog = jspb;
var global = Function('return this')();
goog.exportSymbol('proto.TileMapState', null, global);
goog.exportSymbol('proto.TileMapTx', null, global);
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.TileMapTx = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.TileMapTx, jspb.Message);
if (goog.DEBUG && !COMPILED) {
proto.TileMapTx.displayName = 'proto.TileMapTx';
}
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto suitable for use in Soy templates.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
* @param {boolean=} opt_includeInstance Whether to include the JSPB instance
* for transitional soy proto support: http://goto/soy-param-migration
* @return {!Object}
*/
proto.TileMapTx.prototype.toObject = function(opt_includeInstance) {
return proto.TileMapTx.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Whether to include the JSPB
* instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.TileMapTx} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.TileMapTx.toObject = function(includeInstance, msg) {
var f, obj = {
data: jspb.Message.getFieldWithDefault(msg, 1, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.TileMapTx}
*/
proto.TileMapTx.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.TileMapTx;
return proto.TileMapTx.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.TileMapTx} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.TileMapTx}
*/
proto.TileMapTx.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setData(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.TileMapTx.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.TileMapTx.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.TileMapTx} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.TileMapTx.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getData();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
};
/**
* optional string data = 1;
* @return {string}
*/
proto.TileMapTx.prototype.getData = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/** @param {string} value */
proto.TileMapTx.prototype.setData = function(value) {
jspb.Message.setProto3StringField(this, 1, value);
};
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.TileMapState = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.TileMapState, jspb.Message);
if (goog.DEBUG && !COMPILED) {
proto.TileMapState.displayName = 'proto.TileMapState';
}
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto suitable for use in Soy templates.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
* @param {boolean=} opt_includeInstance Whether to include the JSPB instance
* for transitional soy proto support: http://goto/soy-param-migration
* @return {!Object}
*/
proto.TileMapState.prototype.toObject = function(opt_includeInstance) {
return proto.TileMapState.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Whether to include the JSPB
* instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.TileMapState} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.TileMapState.toObject = function(includeInstance, msg) {
var f, obj = {
data: jspb.Message.getFieldWithDefault(msg, 1, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.TileMapState}
*/
proto.TileMapState.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.TileMapState;
return proto.TileMapState.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.TileMapState} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.TileMapState}
*/
proto.TileMapState.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setData(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.TileMapState.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.TileMapState.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.TileMapState} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.TileMapState.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getData();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
};
/**
* optional string data = 1;
* @return {string}
*/
proto.TileMapState.prototype.getData = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/** @param {string} value */
proto.TileMapState.prototype.setData = function(value) {
jspb.Message.setProto3StringField(this, 1, value);
};
goog.object.extend(exports, proto);

View File

@ -30,7 +30,7 @@
"formik": "^0.11.11",
"jquery": "^3.3.1",
"lodash": "^4.17.10",
"loom-js": "^1.14.0",
"loom-js": "^1.17.0",
"openzeppelin-solidity": "1.10.0",
"react": "^16.3.2",
"react-blockies": "^1.3.0",