發佈 AZTEC 至 Ganache

本文為此系列文章的第二部分:

  1. AZTEC 協定簡介
  2. 發佈 AZTEC 至 Ganache (英文原文)
  3. 證明、簽收、及檢視金鑰管理
  4. 建立及使用加密資產

AZTEC 已發佈了相關合約至 Ropsten 和 Rinkeby 等測試鏈。合約的位址列在 NPM 套件 @aztec/contract-addresses 中。合約的文件則可參考 @aztec/contract-artifacts

然而對大部分開發情境而言,將合約發佈至 Ganache 較容易進行測試。流程也跟發佈至以太坊私鏈類似。

本篇文章的程式碼已上傳至 github 專案。裡面包含所需的套件跟設定。

  1. 下載專案至本機 git clone git@github.com:AztecProtocol/aztec-ganache-starter-kit.git
  2. 安裝套件 cd aztec-ganache-starter-kit && yarn install
  3. 複製環境檔 cp RENAME_ME.env .env
  4. 啟動 Ganache yarn start (同時會依 .env 裡的資料創立帳號)
  5. 發佈 AZTEC!yarn migrate

接下來讓我們細看這個專案做了什麼:

第 1 步

首先,我們需擁有合約原始檔以讓 Truffle 編譯。檔案已發佈至 NPM 套件@aztec/protocol

yarn add @aztec/protocol

第 2 步 — 發佈 ACE

const ACE = artifacts.require('./ACE.sol');
const AdjustSupply = artifacts.require('./AdjustSupply.sol');
const BilateralSwap = artifacts.require('./BilateralSwap.sol');
const DividendComputation = artifacts.require('./DividendComputation.sol');
const JoinSplit = artifacts.require('./JoinSplit.sol');
const PrivateRange = artifacts.require('./PrivateRange.sol');
const utils = require('@aztec/dev-utils');
const {
constants,
proofs: {
JOIN_SPLIT_PROOF,
MINT_PROOF,
BILATERAL_SWAP_PROOF,
DIVIDEND_PROOF,
PRIVATE_RANGE_PROOF,
},
} = utils;
module.exports = async (deployer, network) => {
if (network === 'development') {
await deployer.deploy(ACE);
await deployer.deploy(AdjustSupply);
await deployer.deploy(BilateralSwap);
await deployer.deploy(DividendComputation);
await deployer.deploy(JoinSplit);
await deployer.deploy(PrivateRange);
    const aceContract = await ACE.deployed();
await aceContract.setCommonReferenceString(constants.CRS);
await aceContract.setProof(MINT_PROOF, AdjustSupply.address);
await aceContract.setProof(BILATERAL_SWAP_PROOF, BilateralSwap.address);
await aceContract.setProof(DIVIDEND_PROOF, DividendComputation.address);
await aceContract.setProof(JOIN_SPLIT_PROOF, JoinSplit.address);
await aceContract.setProof(PRIVATE_RANGE_PROOF, PrivateRange.address);
}
};

如第一篇文章提到的,AZTEC 有一套信賴建置系統來執行範圍證明運算。利用 ACE 的 setCommonReferenceString 方法可設定信賴建置系統的資料庫:

await aceContract.setCommonReferenceString(constants.CRS);

透過 ACE 的 setProof(proofId, address) 方法來設定各個執行證明的合約位址。proofId 為證明的類別,可從 NPM 套件 @aztec/dev-utils 裡取得定義:

const utils = require('@aztec/dev-utils');
const {
proofs: {
JOIN_SPLIT_PROOF,
MINT_PROOF,
BILATERAL_SWAP_PROOF,
DIVIDEND_PROOF,
PRIVATE_RANGE_PROOF,
},
} = utils;

第二個參數則為已發布的合約位址:

await aceContract.setProof(MINT_PROOF, AdjustSupply.address);
await aceContract.setProof(BILATERAL_SWAP_PROOF, BilateralSwap.address);
await aceContract.setProof(DIVIDEND_PROOF, DividendComputation.address);
await aceContract.setProof(JOIN_SPLIT_PROOF, JoinSplit.address);
await aceContract.setProof(PRIVATE_RANGE_PROOF, PrivateRange.address);

第 3 步 — 發佈零知識資產 (ZKAsset)

當 ACE 及所需的證明合約都已發佈,我們就可以建立自己的零知識資產!

const ACE = artifacts.require('./ACE.sol');
const ZkAsset = artifacts.require('./ZkAsset.sol');
const ZkAssetMintable = artifacts.require('./ZkAssetMintable.sol');
const TestERC20 = artifacts.require('./TestERC20.sol');
module.exports = async (deployer, network) => {
await deployer.deploy(TestERC20);
  if (network === 'development') {
const aceContract = await ACE.deployed();
    // initialise the ZkAsset with an equivilant
await deployer.deploy(
ZkAsset,
aceContract.address,
TestERC20.address,
1,
false,
true
);
}
};

建立零知識資產需要 5 個參數:

  1. aceAddress — ACE 合約的位址
  2. linkedTokenAddress — 零知識資產所代表的公開 ERC20 代幣合約位址,如不代表特定代幣則可設定為 address(0)
  3. scalingFactor — 與代表的公開代幣間轉換的比例因數
  4. canAdjustSupply — 布林值,如為真則表示合約擁有者可改變票據的總供給量
  5. canConvert — 布林值,如為真則可轉換為所代表的公開代幣。零知識資產合約本身已內建類似於 ERC20 的 confidentialTransfer 轉換機制。如需要更複雜的應用,可以解析證明的返回值,然後使用從當中獲取的資訊來更新相關票據在登記所裡的狀態。

最後,在專案目錄下執行 truffle migrate。Truffle 會依上面兩個檔案發佈 ACE、各個證明合約、以及測試用的零知識資產合約到 Ganache 上。

這是系列文章的第二部分。下一篇:證明、簽收、及檢視金鑰管理