Coder Social home page Coder Social logo

organization's Introduction

Organization

A repo for discussions and other non-code organizing stuff.

Introduction

This repository is for bundling communication around organization issues, common guidelines and project discussions.

Use the issue tracker as a forum.

Work Updates

Updates within the EthereumJS ecosystem - also posted on reddit on a monthly basis - can be found in the posts folder.

Have a look at the list of all current open issues for an impression of what is being worked on.

Communication

Gitter channel for everyday communication:

Discord

Contribution Guidelines

TODO

Labeling System

Within the EthereumJS repositories git-labelmaker is used to maintain an organization-wide issue and PR labeling system. Definitions of labels for different categories can be found in the labels folder. See the git-labelmaker repository for instructions on how to distribute (parts of) these labels to a new repository.

Inspirations for the labeling system:

Documentation

Sources for documentation can be found in the docs directory. Documentation is generated using the Python Sphinx documentation generator in v1.8.x using a Python 3.6 environment.

Documentation can be manually generated running make html from the docs directory.

organization's People

Contributors

evertonfraga avatar holgerd77 avatar omahs avatar ryanio avatar s1na avatar timqian avatar vpulim avatar wanderer avatar whymarrh avatar wolovim avatar zachinquarantine avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

organization's Issues

Coveralls - Introduce decrease and absolute failure thresholds

Just discovered that Coveralls allows for both decrease and absolute thresholds (on the project settings page) for indicating failure on CI runs.

I've now set the descrease failure threshold to 0.5% for the VM, since in practice many PRs are displayed as failure just because of tiny coverage decreases, which limits the meaningfulness of build overviews.

This should be done for the different libraries with a practical threshold. There probably should also be inserted an absolute threshold to encourage to stay above a desired limit.

Rework browser strategy

Situation

Our browser strategy having a monolithic browser-builds repository has proven as a dead end, with one failed revival attempt and otherwise being stalled for months.

Therefore we should shift here to an in-repository approach - like everyone is doing it - and directly deliver browser-friendly builds within the different repos + do accompanying testing and optimization. There is some groundwork here one can build on - e.g. karma browser tests in some libraries (e.g. for https://github.com/ethereumjs/ethereumjs-tx), but this is fragmented, often outdated (especially README instructions and examples), so there shouldn't be expected too much from that.

Process

Work towards browser compatibility can as some guidance be done in a two-step process and would encompass the following components:

First round (get it to work):

  • Open a new issue for browser compatibility for the library with a reference to this meta issue to keep track
  • Analyze the current state of the library and add some notes on the issue page
  • Discuss/choose an appropriate bundler (webpack, rollup, other)
  • Add testing (karma) of the bundling setup
  • Add browser build instructions to the README
  • Add caveats and known limitation descriptions to the README
  • Update the docs/README with at least one working browser example

Second round (optimization):

  • Analyze bundle size, optimize bundling process, make code optimizations
  • Analyze browser build performance, benchmark, optimize on that
  • Think about browser-specific edge cases and add these to the common test suite

Note1: Note that these too rounds are partly interdependent (especially the choice of a bundler regarding to future optimizations), this write-up is just to give this process some structure.

Note2: It might make sense to think these steps along library rewrite, especially a switch to an ES6 modules structure (for rollup) and/or rewriting a library in Typescript.

Note3: It will probably make sense to start introducing this in a smaller library with not too many dependencies, and not directly start with e.g. the virtual machine.

Performance Improvements Strategy & Tracking Issue

This issue is to keep track of the ongoing activities around improving the performance of the various EthereumJS libraries - especially the VM - and serve as a general entry point to the topic.

Focus

Improvement Targets

The following library parts are especially suited for performance improvement work (feel free to add):

Library Improvement Ideas Tracking Issue
VM Execution, Cache Improvements (StateManager), Stack & Memory Management, Precompiles  ethereumjs/ethereumjs-monorepo#865
Merkle Patricia Tree Checkpointing, Storage Backend, Tree Search, Cache Improvements (Tree Search, Storage) https://github.com/ethereumjs/merkle-patricia-tree/issues/132
Ethash Overall Execution
Util Hashing, Signatures
RLP  Encoding / decoding, highly used in e.g. MPT

Improvement Areas

Possible improvements areas:

  • Algorithmic Improvements on performance sensitive code parts (iteration strategy, data structures,...)
  • More sophisticated caching
    • Cache Structure & Setup (what to store? how long to store? where to store?)
    • Cache Application (when to use? when to flush?)
  • Storage Backends
  • Build Improvements (build target, dependencies, compiler flags,...)
  • Environment & Language (WASM)

Benchmarks / Tooling

Performance Measurement Setups

Helpful setups for performance analysis:

  • Dedicated benchmarking tool
  • CI Runs
  • Behaviour (optimally on reproducible tasks) in a productive environment (e.g. the VM within Buidler)

Benchmark Tooling

Helpful JavaScript/CI Tooling:

Progress Tracking

It would be nice if we collect some comprehensive results on progress being made over time here.

Note: this can be challenging if the benchmarking suite evolves/changes significantly over time. We'll see.

alternate ethereum front-end lib

ideals:

  • single observable lazy state tree
  • emit top-level events for block, fork
  • subscribe to logs, account balance/nonce/storage, etc

account.balance -> value is pumped to somewhere in state trie

  • set focus via blocks-from-head parameter

always query state 5-blocks back from head, tx not 'firm' until 5 blocks back from head

  • pipelines > callbacks
  • submit tx, get results
  • submit tx suggestion, get back a generic filter that can handle stranger cases (e.g. look for log from completeion of on-chain multisig, meta-tx's)
var pendingTx = exampleContract.foo.sendTransaction(2, {from: web3.eth.coinbase});
// transaction hash
pendingTx.getHash(funtion(err, result){ console.log(result) }) // tx hash
pendingTx.on('returnValue', function(err, returnValue){ console.log(returnValue) }) // tx return value

Project suggestion: create monorepo for blockchain data schemes

  • ethereumjs-tx
  • ethereumjs-acocunt
  • ethereumjs-block
  • [ethereumjs-collation]

All of these provide (de)serialisation of data. They could be placed into a single repo, where the appropriate modules can still be loaded selectively from the outside, for example: require('ethereumjs-data-schemes/tx).

This should help in the maintenance work as it would reduce the number of repositories.

Witness Support

Witness format specification along the Eth1.x initiative is in development within the stateless-ethereum-specs repository.

The format definition itself is not too much of black magic and I think it makes sense to start on an integration early on to help a bit along on the research and specification side. Scope of the work is limited and there needs to be a start at some point (imagine Prysmatic having waited for the Eth 2.0 specs to finalize 😜).

Things get trickier on the real-life-behavior properties side with demands on stream- and chunkability together with restrictions on memory allocation, see Representation section in the docs. I e.g. first thought to have a separate witness repository with a class-based representation of a witness: this might not be feasible due to the memory constraints?

My suggestion would be to start relatively low and to concentrate on format decoding and to forget about the other properties for now.

We can e.g. add an (experimental) function...

type Witness = Buffer // some basic Buffer-based witness type

Trie.fromWitness(witness: Witness, trie?: Trie): Promise<Trie>

... to the merkle-patricia-tree library a bit analogue (on the signature) to the Trie.fromProof method. Then we can slowly get a better feeling for the format and are driven more to engage in the specs repo and so generally have some starter here to further build upon. I would assume that it should be possible for larger parts of the code created along to be re-used within a more finalized implementation structure going more coherent with the additional properties from the spec. Does this make sense?

One base question here to answer as a pre-requisite is if this makes sense to implement on top of a hex trie implementation, also asked this here ethereum/portal-network-specs#10 on the specs repo.

So eventually we need to reflect on a binary trie strategy (add/implement/re-use) first. Update: see also #16

Other sources:

Hackathon Date/Place?

Cast your votes for the time and place of the next Ethereum JS (and related projects ... looking at you ipfs :P) Hackathon! Let's hear where you want to go.

Last time was in Seattle, US so lets try to hit a different country and
@SilentCicero wanted to go somewhere warm

Monorepo clusters / Testing integration of connected libraries

Due to the tight coupling of libraries, modifications in one could surface errors in other dependent libraries. Currently errors are found only after the library in question is released and other libraries update their dependencies. I think it'd help a lot if integration errors would surface during development and they'd become easier to find/fix.

Maintaining a monorepo of some of the highly interconnected libraries (VM, blockchain, block, etc.), as it is being discussed in #27, would enable running tests across libraries during development and would also facilitate cross-library changes.

Another approach would be to write a more complex circleci workflow which fetches all relevant libraries and tests them against each PR. Not sure how such a workflow would look like.

I'd be happy to hear your thoughts on these two approaches, or other potential ones.

Rename organization

When looking for JavaScript libraries that can be used within Ethereum, I often end up on this organization or one of its repos. For most of the time, however, I end up being confused as the code is "ts" and not "js".

Even for the main repo that is called "https://github.com/ethereumjs/ethereumjs-monorepo", 98% of the code is Typescript and not Javascript. Hence, to label appropriately what is contained in the repositories, I'd like to suggest that you rename or anyways distinguish repositories or your organization.

"Ethereum Javascript Community - Your Javascript Gateway to Ethereum". could become

"Ethereum Typescript Community - Your Typescript Gateway to Ethereum"

I'm aware that this issue description may sound controversial. Do I want to start a flamewar? No. Rather, I see it as a bureaucratic and proper thing to label a repository by what it contains. That's all.

Add some comprise general developer guidelines for ethereumjs libraries

A lot of new developers - including myself - always stumble about similar questions and are a bit lost on design decisions when working on ethereumjs libraries.

These include questions like:

  • Which Node version should I target for?
  • Which platform should I keep in mind when developing (browser / react / build pipelines)?

There is also some generic tooling like:

  • Using linting
  • Testing best practices
  • Information on CI/Travis build practices

Without putting this over the top/over-formalizing it would be good to have some common document with developer guidelines/best practices where this is taken a bit together in a comprised way.

As a side note: this only makes sense if this has some broader acceptance and is updated on a at least semi-regular basis.

Tracking issue: BigInt

Currently we use bn.js in our packages. Since browsers are slowly rolling out BigInt (native arbitrarily large integers) we might want to move long-term to use BigInt instead of the bn.js dependency.

Design problems and a proposal to fix them

I'm opening this issue to summarise what IMO are the problems with the current design of some libraries and to propose an alternative.

Problems

From my perspective, there are three interconnected problems in the libraries that represent protocol objects (i.e. Account, Block and Transaction):

  1. They are based on ehereumjs-util's defineProperties. This function is based on super dynamic aspects of javascript, making the libs hard to adapt to typscript, hard to understand, and hard to maintain. This has been discussed during multiple typescript migrations, most notably during ethereumjs-account's one.

  2. They are designed around the RLP representation of each object. While this isn't necessarily a bad thing, these libraries are also used by smart contracts and dapps developers, that don't have enough understanding of the protocol and have trouble understanding some things. A clear example of this is that ethereumjs-tx periodically receives false bug reports about leading zeros being stripped. This is the expected behavior when working with the RLP representation of some of the transactions fields, but totally unexpected for someone using it for another purpose.

  3. All of them are mutable. This is an issue, as there are complex requirements/dynamics between them, and being able to mutate each object individually opens the door to getting objects out of sync. An example of this is parsing a block, which will construct a Block object and a series of Transaction objects, and then changing the block number to 0. This would/should render any EIP155-signed transaction invalid, but it's not clear how this can be implemented with the current design. What will probably happen now is that the Block and the Transactions will have incompatible Common instances.

Proposal

I think (1) can be solved without breaking changes by inlining part of defineProperties logic in each library. I implemented a prototype of a similar idea on ethereumjs-tx in this PR. While I consider this an improvement, it will mostly increase the maintainability of the libraries. This change wouldn't make any difference with (2) and (3), which are the points that can lead to confusion and bugs in the users' code.

In my opinion, to effectively fix (3) without an intricate design that may not be enough in the future, we should prohibit mutating the domain objects. This means making Account, Transaction and Block immutable. And the same should be done for Common. If they are immutable, everything can be validated on construction, and objects can't get out of sync.

Fixing (2) needs a deeper redesign of the libraries. RLP should be treated just as a serialization strategy, and everything should be modeled with their actual data types instead of everything being a Buffer.

I think a good approach to design them would be to aknowledge that there are multiple representations of these objects, implement everything as close to the actual domain as possible, and make it easy to go from one representation to the others. At the moment, I think these should be:

  • Domain objects: All the fields have their actual data type. If something is a number, for example, it should be represented as a bigint or BN.js. These should be normal classes, everything dealing with how to get from other representation to this one should be placed in a factory method.

  • Json objects: this is pretty self-explanatory, with a domain object you should be able to construct a json object, where everything is represented as string.

  • RLP representation: A factory method should be able to construct a domain object from its RLP serialization, and domain objects should be RLP serializable.

  • Plain javascript objects: The most common way to represent things like transactions in ethereum today are plain js objects, most of the times even object literals. To adapt to this reality, there should be factory methods that turn these representations into a domain object.

Example implementation

I sketched how Transaction would look if reimplemented with this design

// I just use this class to indicate that the Common object should be immutable
class ImmutableCommon {}

// These functions and types should go to a shared library, -util?

function bigIntToRlp(bn: bigint): Buffer {
  return Buffer.from([]);
}

class Address {
  public serialize(): Buffer {
    return Buffer.from([]);
  }
}

export interface TransformableToBuffer {
  toBuffer(): Buffer;
}

export type BufferLike = Buffer | TransformableToBuffer | string | number;
export type AddressLike = string | Address;
export type BigIntLike = string | bigint | number;

export function addresLikeToAddress(addr: AddressLike): Address {
  return new Address();
}

export function bufferLikeToBuffer(bl: BufferLike): Buffer {
  return Buffer.from([]);
}

export function bigIntLikeToBigInt(bil: BigIntLike): bigint {
  return 1n;
}

export function bigIntToHex(bi: bigint): string {
  return "0x" + bi.toString(16);
}

// The -tx proposal starts here.

export interface TxData {
  gasLimit?: BigIntLike;
  gasPrice?: BigIntLike;
  to?: AddressLike;
  nonce?: BigIntLike;
  data?: BufferLike;
  v?: BigIntLike;
  r?: BigIntLike;
  s?: BigIntLike;
  value?: BigIntLike;
}

export interface JsonTx {
  gasLimit?: string;
  gasPrice?: string;
  to?: string;
  nonce?: string;
  data?: string;
  v?: string;
  r?: string;
  s?: string;
  value?: string;
}

class Transaction {
  // **This is the "entry point" for people working with objects at the protocol
  // level.** It takes a serialized tx as seen in the protocol, and returns an
  // immutable domain object.
  public static deserialize(
    rlpSerializedTx: Buffer,
    common: ImmutableCommon
  ): Transaction {
    // parse the rlp buffer
    return new Transaction(/* ... */);
  }

  // **This is the "entry point" for people working with the RPC or other higher
  // level applications.** While the domain object is already pretty high level,
  // having a way to go from bare javascript objects into a domain object is
  // super useful.
  //
  // This function would probably be the most commonly used.
  //
  // This function handles default values.
  public static fromTxData(txData: TxData, common: ImmutableCommon) {
    return new Transaction(
      common,
      txData.nonce !== undefined ? bigIntLikeToBigInt(txData.nonce) : 0n,
      txData.gasLimit !== undefined
        ? bigIntLikeToBigInt(txData.gasLimit)
        : 9000n,
      txData.gasPrice !== undefined
        ? bigIntLikeToBigInt(txData.gasPrice)
        : 8000000000n,
      txData.to !== undefined ? addresLikeToAddress(txData.to) : undefined,
      txData.value !== undefined ? bigIntLikeToBigInt(txData.value) : 0n,
      txData.data !== undefined
        ? bufferLikeToBuffer(txData.data)
        : Buffer.from([]),
      txData.v !== undefined ? bigIntLikeToBigInt(txData.v) : undefined,
      txData.r !== undefined ? bigIntLikeToBigInt(txData.r) : undefined,
      txData.s !== undefined ? bigIntLikeToBigInt(txData.s) : undefined
    );
  }

  // Everything is readonly.
  public readonly common: ImmutableCommon;
  public readonly nonce: bigint;
  public readonly gasLimit: bigint;
  public readonly gasPrice: bigint;
  public readonly to?: Address;
  public readonly value: bigint;
  public readonly data: Buffer;
  public readonly v?: bigint;
  public readonly r?: bigint;
  public readonly s?: bigint;

  // This constructor just takes the values, validates them, assigns them and
  // freezes the object.
  constructor(
    common: ImmutableCommon,
    nonce: bigint,
    gasLimit: bigint,
    gasPrice: bigint,
    to: Address | undefined,
    value: bigint,
    data: Buffer,
    v?: bigint,
    r?: bigint,
    s?: bigint
  ) {
    // TODO: Validate everything

    this.common = common;
    this.nonce = nonce;
    this.gasLimit = gasLimit;
    this.gasPrice = gasPrice;
    this.to = to;
    this.value = value;
    this.data = data;
    this.v = v;
    this.r = r;
    this.s = s;

    Object.freeze(this);
  }

  // This function is the way to go from a domain object to the protocol
  // representation of a transaction.
  //
  // Things that were previously handled by `defineProperties` are handled here.
  // For example, stripping the leading zeros of numeric values.
  serialize(): Buffer {
    return rlpencode([
      bigIntToRlp(this.nonce),
      bigIntToRlp(this.gasLimit),
      bigIntToRlp(this.gasPrice),
      this.to !== undefined ? this.to.serialize() : Buffer.from([]),
      bigIntToRlp(this.value),
      this.data,
      this.v !== undefined ? bigIntToRlp(this.v) : Buffer.from([]),
      this.r !== undefined ? bigIntToRlp(this.r) : Buffer.from([]),
      this.s !== undefined ? bigIntToRlp(this.s) : Buffer.from([])
    ]);
  }

  // Methods that previously altered the object, now return a new one.
  sign(privateKey: Buffer): Transaction {
    const data = this.getDataToSign();
    const signature = sign(data, privateKey);

    return new Transaction(
      this.common,
      this.nonce,
      this.gasLimit,
      this.gasPrice,
      this.to,
      this.value,
      this.data,
      signature.v,
      signature.r,
      signature.s
    );
  }

  toJson(): JsonTx {
    return {
      nonce: bigIntToHex(this.nonce)
      // ...
    };
  }
}

// Sample usage:

const common = new ImmutableCommon("mainnet");

const tx = Transaction.fromTxData(
  {
    to: "0x123123123123213123123123123",
    value: 123123
  },
  common
);

// Modifying a tx

const txNonce123 = Transaction.fromTxData(
  {
    ...tx,
    nonce: 123
  },
  tx.common // Having to pass common here seems error-prone
);

// Signing a tx

const pk = Buffer.from([]);
const signedTx = tx.sign(pk);

Unknowns

There are two things that are hard to answer about this proposal:

  1. How do we go from the current design to this one incrementally? It'd be a major implementation and coordination effort.

  2. How would implementing everything with types more abstract than Buffer impact on the project's performance? I have a strong belief that it wouldn't be much of an impact, as we are copying buffers and transforming them from/to strings super often now.

Previous discussions

Finally, here's a list of interesting links where these things have been discussed:

Previous discussions about the limitations of the design:

ethereumjs/ethereumjs-block#69 (comment)
https://github.com/ethereumjs/ethereumjs-account/issues/29
https://github.com/ethereumjs/ethereumjs-tx/issues/151
ethereumjs/ethereumjs-tx#154

Common "bugs" that users report because of the libraries using RLP-based representation.

https://github.com/ethereumjs/ethereumjs-tx/issues/74#issuecomment-318066638
https://github.com/ethereumjs/ethereumjs-tx/issues/112
https://github.com/ethereumjs/ethereumjs-tx/issues/140
https://github.com/ethereumjs/ethereumjs-tx/issues/164
https://github.com/ethereumjs/ethereumjs-util/issues/141

Push a new commit on deprecated repos replacing the README

The README should point the user to the location of the successor project. Also preferably every other file should be removed only leaving the README (Git history can still be used to find everything else if needed).

Affected:

Educational visualization suite & framework

It would be awesome to have a scriptable visualization framework that could be used to explore properties of the network, or to create educational animations.

I'm pretty new to the crypto and ethereum space, and what would help a lot in my understanding is a set of animations of the execution of simple contract code, how a block is propagated and verified, and how the network rejects false blocks injected by a malicious actor would be AMAZING.

I'm imagining a bit of an in-browser emulater, where I could set up nodes, "deploy" contracts, step through the mining process, designate a node to find a block, essentially step through any part of the protocol on any node. Then, if this was scriptable, we could create a suite of explanatory animations for those looking for an accurate picture of how the network actually works.

Release strategy for stable and beta versions

EthereumJS VM packages are published with beta prereleases (example 5.0.0-beta.1) with the 'latest' dist-tag. What makes NPM to install this versions by default via npm i @ethereumjs/vm. To avoid this there should be some distinct dist-tag specified to prevent prereleases from being installed by regular users unintentionally. To do so it's enough to specify dist-tag on publishing like this:

npm publish --tag next

This will let users to install stable version e.g. 4.0.0 with npm install @ethereumjs/vm and to install version 5.0.0-beta.1 with npm install @ethereumjs/vm@next.

Motivation

Without such well known strategy users who depends on EthereumJS libraries don't know when to test their software for future versions compatibility. They also don't have an ability to install the future version without cloning the repo and investigating what changes are notable and will be published with the next version.

Proposal

  1. Use next, beta, or unstable dist-tags to publish version of EthereumJS libraries before the stable version is published.
  2. Define and publish in some well-known place this information, for example like electronjs do on it's main page.
    www electronjs org
  3. Specify the list of possible prereleases e.g. (alpha, beta, rc or beta, nightly) to use in packages version.
  4. Automate integrity checks to prevent accidental publishing with wrong tag or prerelease.

Serialization and RPC libraries

With a little extra work, augur's serialization and RPC libraries could possibly be useful general-purpose tools.

augur-abi: needs Solidity support; right now only does contact ABI serialization for Serpent's datatypes. (Also should probably be renamed, as this is our implementation of the contract ABI, not "augur's ABI"...)

ethrpc: there are a few augur-specific things (such as the hosted nodes) that might need to be changed.

No idea if there's any interest in this, but just thought I'd throw this out there to see.

Missing labels for new labelling system

The new labelling system for the various repositories might lack some additional labels. We maybe don't want to overstress here, but I might do another round in a couple of weeks and add missing labels if there is a clear demand.

Labels missing can be collected here.

Logo

we need a cool logo

Rename main Gitter communcation channel from ethereumjs-lib to ethereumjs

The Gitter channel used for ethereumjs communication at gitter.im/ethereum/ethereumjs-lib is still named after the old central VM library ethereumjs-lib, which is now in a deprecated/archived state.

This is misleading for new users and also doesn't provide a clear scope of the topics discussed in the channel.

Channel should be renamed to just ethereumjs, with a final "channel has moved" message on the old channel.

Over time links in the README pages of the various libraries should be updated as well.

Library Consolidation

Many libraries within EthereumJS have are in an unclear state regarding ownership and maintenance status. Here is a list taken from an internal chat discussion:

  • ethrpc: Historically maintained externally by people from Augur, not much activity and not clear if actively maintained -> communicate with current part-time maintainers, move to Augur? GitHub org, take on within the JS team?
  • eth-bin-to-ops: Tiny, not touched very much (just 8 commits), likely in our own responsibility :-) -> usage status unclear, candidate for deprecation or monorepo consolidation, others (?)
  • node-ethash: not actively maintained (last commit 2017), usage status absolutely unclear (no user within EthereumJS scope)
  • eth-query: tiny, not actively maintained, usage status unclear -> eventually ask Kumavis on this, otherwise also deprecation or monorepo
  • keythereum: also inititated from guys from Augur (tinybike), not actively maintained atm, I have also no good overview on the usage base, in doubt undermaintained though
  • fixed-bn.js and sharding: (relatively new) experiments by @s1na
  • ethereumjs-icap: in our responsibility, I think this is used (not sure though), a bit undermaintained and could need some more occasional updates (library not too big though)
  • helpeth: in our responsibility made by @axic, undermaintained since touches security related stuff, not completely sure about the usage status though
  • ethereumjs-blockstream: also from Augur, similar to ethrpc
  • browser-builds: several trials to revive not lasting, concept just doesn't work out
  • ethereumjs.github.io: some basic EthereumJS website on GitHub, I once gave this an update, not too accurate any more, can eventually be abandoned, no decision pressure there though
  • ethereumjs-units: similar to the icap library
  • ethereumjs-verified-contracts: fanatid moved this to EthereumJS some time ago, this is not totally fitting to the EthereumJ scope and also not maintained, I would have a tendency to just ask him to take this back/somewhere else
  • ethereumjs-stub-rpc-server: Augur, not maintained at all, deprecation/archive candidate?
  • geth.js: Augur, not maintained at all, deprecation/archive candidate?
  • eth-bin-to-method-ids: similar to eth-query (tiny, originally from Kumavis)

Over the next weeks and months we should go through these libraries, contact eventual maintainers, retake on maintenance ourself or deprecate or archive, this will be a case-by-case selection.

A library felt to be shifted to a clear status again should be checked in the list above. Sub issues created for single libraries along this meta issue should also be linked within the list.

Tracking issue: Move from Buffer -> Uint8Array

As mentioned by @ricmoo, the nodejs injected Buffer is insecure and also makes adds a browser dependency of a Buffer implementation. It seems that for (most of?) our use cases, we should use Uint8Array and not Buffer, ideally we remove this "dependency" from our packages.

Tracking issue as this is a long-term issue.

The async library

This another meta-issue on how to improve IMO the state of ethereumjs in general.

Most libraries use the npm package async. This was kind of standard practice in the node.js community many years ago, but that's no longer the case.

Code written with this library is hard to read and maintain, and I believe it prevents new people from collaborating. Take a look at this function for a clear example of how scary it can get.

Personal preferences apart, this library prevents v8 from creating async stack traces. These were released (enabled by default) in node 12. For them to work, you have to stick to async/await. If you don't, this feature removes some internal (e.g. process._tickcallback calls) stack frames, leaving an almost empty (even emptier than before!) stack trace.

I know this is a huge change, but I believe it's important.

I think a good way to start working on this can be migrating the tests from a library. For example, ethereumjs-blockchain's test.

Strong mission

I'm reading Social architecture
which states

Strong mission -- the stated reason for the group's existence

The starting point for any community is a stated mission. The mission defines the goals that we can all agree on in advance, before we join the project. It's like the title of a website or the slogan for a movie. For instance, Reddit's title is: "the front page of the Internet," an ambitious mission that it nonetheless achieved. Facebook's slogan is: "helps you connect and share with the people in your life."
TIP: Use your mission as a slogan, on your website, marketing, presentations, and so on. If you are investing money in your community, you may want to trademark the mission statement.
Without a clear mission, an on-line community won't grow. A group of friends who start a project may agree what they want to do, yet anyone new coming on board has to guess what they had in mind. People will guess wrong, and will change their minds over time. This leads to confusion, disagreement, and disappointment as people find that their hard work was wasted because the rest of the group headed off in a different direction.

Guidelines for Gitter support questions

The quality of support questions on Gitter from people ranges very broadly. Often people put far too common questions without any context, like "I tried this library in environment x and got an error, why?". From observation there are two ways these questions are currently handled:

a) There are ignored (most often, feels somewhat bad)
b) There is a large pre-discussion guiding the people to post more context, error descriptions, etc. to extract where the actual error lies.

It would probably be helpful to have a common document on this with some guidelines how to write a good question and what to provide as context. Then we could just do a first short "Please have a look at ...." note and the experience would get more satisfactory on both sides.

This can probably be similar to issue descriptions, with at least one key differentiation that questions should be kept short and as information rich as possible, to avoid page-long question postings.

TypeScript Transition

This issue should help to work out a TypeScript transition strategy for the different EthereumJS libraries and discuss strategies, collect best practices and inform about caveats.

Work dynamics in a growing repository

We’ve got more activity now that we have the VM monorepo. I have some concerns:

Whenever a PR is merged, every other PR gets an outdated state, requiring either a click on “Update branch”, or a git rebase from CLI. Each update triggers all the PR’s CI jobs. It slows down work. If any other PR gets merged in the mean time, you’ll have to do it again.

There are some cards on the table we can try to use to mitigate this problem:

A) Relax the rule “Require branches to be up to date before merging”. I am aware that non orthogonal changes can lead to failure, but as we don’t do continuous delivery with many releases per week, I think it might worth the try, keeping an eye on the CI runs after merging PRs.

B) Optimize the CI structure, so we can have more concurrent PRs building jobs. (in progress: #778).

C) Upgrade plan to have 60 concurrent jobs for the organization.

D) Ways of running less concurrent jobs per CI run.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.