fix: go and rust contract compatible with browser

This commit is contained in:
ppedziwiatr
2022-04-08 14:17:19 +02:00
parent d1462745f5
commit acbc026f5c
4 changed files with 27 additions and 18 deletions

View File

@@ -62,7 +62,7 @@
"fast-copy": "^2.1.1",
"knex": "^0.95.14",
"lodash": "^4.17.21",
"redstone-isomorphic": "1.1.5",
"redstone-isomorphic": "1.1.6",
"redstone-wasm-metering": "1.0.0",
"safe-stable-stringify": "2.3.1",
"stream-buffers": "^3.0.2",

View File

@@ -21,7 +21,7 @@ import { rustWasmImports } from './wasm/rust-wasm-imports';
import { Go } from './wasm/go-wasm-imports';
import BigNumber from 'bignumber.js';
import { NodeVM, VMScript } from 'vm2';
import { Buffer as isomorphicBuffer } from 'redstone-isomorphic';
import * as Buffer from 'buffer';
class ContractError extends Error {
constructor(message) {
@@ -58,17 +58,14 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
let wasmInstance;
let jsExports = null;
const wasmResponse = generateResponse(contractDefinition.srcBinary);
switch (contractDefinition.srcWasmLang) {
case 'assemblyscript': {
const wasmInstanceExports = {
exports: null
};
const init = { status: 200, statusText: 'OK', headers: { 'Content-Type': 'application/wasm' } };
const response = new Response(contractDefinition.srcBinary, init);
// to make Chrome happy
wasmInstance = await loader.instantiateStreaming(response, asWasmImports(swGlobal, wasmInstanceExports));
wasmInstance = await loader.instantiateStreaming(wasmResponse, asWasmImports(swGlobal, wasmInstanceExports));
// note: well, exports are required by some imports
// - e.g. those that use wasmModule.exports.__newString underneath (like Block.indep_hash)
wasmInstanceExports.exports = wasmInstance.exports;
@@ -96,7 +93,7 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
* to NOT mangle the import function names - unfortunately that is not currently possible
* - https://github.com/rustwasm/wasm-bindgen/issues/1128
*/
const wasmModule: WebAssembly.Module = await WebAssembly.compile(contractDefinition.srcBinary);
const wasmModule = await getWasmModule(wasmResponse, contractDefinition.srcBinary);
const moduleImports = WebAssembly.Module.imports(wasmModule);
const wbindgenImports = moduleImports
.filter((imp) => {
@@ -112,7 +109,7 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
);
jsExports = exports;
wasmInstance = new WebAssembly.Instance(wasmModule, imports);
wasmInstance = await WebAssembly.instantiate(wasmModule, imports);
wasmInstanceExports.exports = wasmInstance.exports;
const moduleExports = Object.keys(wasmInstance.exports);
@@ -141,8 +138,8 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
swGlobal.useGas(value);
}
};
const wasmModule = await WebAssembly.compile(contractDefinition.srcBinary);
wasmInstance = new WebAssembly.Instance(wasmModule, go.importObject);
const wasmModule = await getWasmModule(wasmResponse, contractDefinition.srcBinary);
wasmInstance = await WebAssembly.instantiate(wasmModule, go.importObject);
// nope - DO NOT await here!
go.run(wasmInstance);
@@ -189,6 +186,19 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
}
}
function generateResponse(wasmBinary: Buffer): Response {
const init = { status: 200, statusText: 'OK', headers: { 'Content-Type': 'application/wasm' } };
return new Response(wasmBinary, init);
}
async function getWasmModule(wasmResponse: Response, binary: Buffer): Promise<WebAssembly.Module> {
if (WebAssembly.compileStreaming) {
return await WebAssembly.compileStreaming(wasmResponse);
} else {
return await WebAssembly.compile(binary);
}
}
export interface InteractionData<Input> {
interaction?: ContractInteraction<Input>;
interactionTx: GQLNodeInterface;

View File

@@ -261,8 +261,6 @@ export const rustWasmImports = (swGlobal, wbindgenImports, wasmInstance, dtorVal
imports['__wbindgen_placeholder__'] = module;
const { TextDecoder, TextEncoder } = require(`util`);
let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
cachedTextDecoder.decode();
@@ -301,6 +299,7 @@ export const rustWasmImports = (swGlobal, wbindgenImports, wasmInstance, dtorVal
let WASM_VECTOR_LEN = 0;
// @ts-ignore
let cachedTextEncoder = new TextEncoder('utf-8');
const encodeString =

View File

@@ -6317,10 +6317,10 @@ rechoir@0.7.0:
dependencies:
resolve "^1.9.0"
redstone-isomorphic@1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/redstone-isomorphic/-/redstone-isomorphic-1.1.5.tgz#ffd357c32716825383c789a4e66231de4a6efc6b"
integrity sha512-3vSyHeO5TcZG3s9ERsoTRFvVksb+rbRwCw1f220ztTL3oCQA3rjsmzAk9Ri0CvxFdTppTTIadzYcjIw9xGJbpg==
redstone-isomorphic@1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/redstone-isomorphic/-/redstone-isomorphic-1.1.6.tgz#513eaf38a7ce14b7e1e84a973aa111066be43f9c"
integrity sha512-q9N6/B1KHFBxeRsaqMZUelLorp7BLh50R4fUTf9LNkZPTMZ+sRRVWVE0aZT7lyKbXTLiEdk8kSOHPY4yQu//7Q==
dependencies:
buffer "^6.0.3"
safe-buffer "^5.1.2"