Skip to content

Smart Contract

zgw edited this page Sep 26, 2018 · 1 revision

QuarkChain runs EVM on each shard and thus supports all Ethereum smart contract bytecode compiled from Solidity.

Deployment

Similar to Ethereum, to build a contract deployment transaction leave the to field empty and put the byte code in the data field. A smart contract is always deployed to a specific shard decided by toFullShardId in the transaction.

fromFullShardId and toFullShardId must map to the same shard in order to succeed. The FULL_SHARD_ID of the contract address created will be the same as toFullShardId. Normally you should just set toFullShardId the same as fromFullShardId.

A couple of comments on smart contract deployment:

  • If a user does not have any balance on the shard where the contract is to be deployed, a user must manually get sufficient balance from either 1) user’s balance of another shard via cross-shard transaction or 2) another user's balance. In the future, case 1) will be automatically handled by a smart wallet.
  • If a smart contract calls another smart contract in the shard, both caller and callee smart contracts must have the same full shard id. Otherwise, such call will fail (TODO: enforce this in VM). This guarantees that both smart contracts will always be in the same shard no matter how the network is resharded.

Calling a Smart Contract

Calling a smart contract is simliar to Ethereum -- you can either use the UI on the blockchain explorer and load the ABI, or you can use a library like quarkchain-web3.js that handles the interfacing for you. As a note, fromFullShardId and toFullShardId must map to the same shard in order for the call to succeed. Otherwise gas will be consumed but the contract will not be called.