Введение

Я помню волнение, которое я испытал, когда впервые услышал об AirBnB. Люди делят неиспользуемое пространство с путешественниками, которым нужно место для проживания.

Теперь я чувствую такое же волнение в криптоиндустрии. С помощью Составного протокола мы можем делиться неиспользованными криптоактивами с заемщиками, которые могут эффективно их использовать. Compound - это криптоэквивалент AirBnB, который позволяет кредиторам зарабатывать до 10% практически без риска.

Цель этого поста - создать простое приложение, которое одалживает Сай и забирает его с процентами. Посмотреть готовый код можно здесь.

Прежде чем мы начнем писать код, я сначала расскажу об основах Compound. Затем мы играем с некоторыми смарт-контрактами в Etherscan, которые будут вызываться в нашем коде.

Примечание: MakerDAO объявил, что они называют старый одинарный залог Dai Sai и новый Multi-Collateral Dai Dai. Таким образом, в этом посте я называю старый Single Collateral Dai Sai.

Компаунд в двух словах

Compound - это децентрализованный протокол кредитования на блокчейне Ethereum. В протоколе может принять участие любой желающий со всего мира.

Они создают рынок процентных ставок для токенов Ethereum и эфира. По состоянию на 20 ноября 2019 года у них семь рынков:

Для каждого рынка существует отдельный смарт-контракт на кредитование. Как кредитор, вы можете предоставлять активы для их смарт-контрактов и получать проценты. Как заемщик, вы можете занимать активы из зарезервированных активов в смарт-контракте, внося залог и выплачивая проценты.

Ни кредитор, ни заемщик не должны указывать процентные ставки. Процентная ставка автоматически определяется рыночными силами. Когда спрос на заем актив невысок, процентная ставка низкая. И наоборот, когда спрос на заем актив высок, процентная ставка высока. Подробнее об этом позже.

Кроме того, ни кредитор, ни заемщик не должны указывать продолжительность. Как я упоминал ранее, протокол требует, чтобы заемщики сохраняли избыточное обеспечение, чтобы избежать риска дефолта заемщика. Как и MakerDAO, их залог подлежит ликвидации, если цена упадет ниже определенной суммы.

Традиционно вам приходилось подбирать кредиторов и заемщиков, а затем согласовывать такие условия, как процентная ставка, обеспечение и срок погашения. Compound снижает затраты на координацию кредиторов и заемщиков через их резервную систему, а также снижает стоимость переговоров за счет их автоматического механизма процентных ставок, заранее определенных типов обеспечения и бессрочной модели. В результате люди могут одалживать / брать токены намного проще и быстрее.

Модель равновесной процентной ставки

Процентные ставки меняются динамически, следуя за ликвидностью, доступной на каждом рынке, и колеблются в каждом блоке в зависимости от спроса и предложения. Чем меньше ликвидности, тем выше процентные ставки. Чем больше ликвидности, тем ниже процентные ставки.

Если вы посмотрите на Составную панель инструментов, вы увидите, что процентные ставки (также известные как годовые процентные ставки) колеблются. Вы также можете проверить использование ликвидности, доступной на каждом рынке (см. Пример Саи ниже). Коэффициент использования - это процент от общей суммы активов, переданных в кредит заемщикам из пула ликвидности. Если коэффициент использования был 90%, 10% Саи доступен для снятия. Таким образом, когда коэффициент использования высок, годовая процентная ставка высока. Когда коэффициент использования низкий, годовая процентная ставка низкая.

cToken

Как кредиторы получают проценты, например? Давайте посмотрим на транзакцию, в которой кто-то передает Sai смарт-контракту Compound. В этой транзакции вы можете увидеть, что она поставляет 7600 Sai. Вы также можете видеть, что взамен она получает около 361,487 cSai.

cSai - это токен ERC20, который представляет ваш баланс, включая стоимость Sai и начисленные проценты. В Compound получить проценты так же просто, как держать этот cSai.

Ценность cSai увеличивается со временем, поскольку он накапливает проценты за каждый блок Ethereum. Если вы хотите вывести Sai, вы просто обмениваете его на свой cSai (cSai на этом этапе сжигается). Тогда вы сможете вернуть свой Саи с интересами.

cSai - один из cTokens, существующих в Compound. На каждом рынке есть собственный токен cToken, например cSai, cEth, cBat и т. Д.

Используя совместимые с ERC20 методы и другие методы в контрактах cToken, пользователи могут предоставлять активы, снимать их, брать в долг, возвращать заем, передавать их и т. Д.

Играйте в Etherscan, чтобы понять смарт-контракты

Затем давайте поиграем со смарт-контрактами в Etherscan, чтобы понять некоторые функции, которые мы собираемся создать.

Мы отправим несколько транзакций с помощью MetaMask. Вам понадобится основная сеть ETH и Sai. Если у вас есть Eth, но нет Sai, зайдите в Uniswap, чтобы получить его.

Есть три шага, чтобы предоставить Саи и затем отозвать его.

  1. вызвать функцию утверждения в контракте токена Sai, чтобы дать одобрение контракту cSai на передачу некоторого количества Sai
  2. вызвать функцию монетного двора в контракте cSai, чтобы предоставить немного Sai и получить взамен немного cSai
  3. вызвать функцию redeemUnderlying в контракте cSai, чтобы обменять мой cSai на Sai

1. функция утверждения

Перейдите на страницу контракта токена Sai Etherscan. Щелкните Подключиться к Web3 и войдите в MetaMask. Теперь вы можете отправлять транзакции с помощью MetaMask.

Перед предоставлением Sai вы должны сначала одобрить контракт cSai, чтобы получить доступ к своему Sai-балансу. Перейдите на вкладку «Написать контракт». Прокрутите вниз до функции утверждения. Укажите сумму Саи, которую вы хотите одобрить.

Убедитесь, что вы дали восемнадцать нулей. Математика в Solidity - это фиксированная точка, а в контракте Sai десятичные числа указаны как 18.

Таким образом, если вы хотите утвердить 1Sai, вам необходимо пройти:

1000000000000000000
// 1 * 10 ** 18

Нажмите на кнопку «Написать» и отправьте транзакцию. Подождите, пока ваша транзакция будет добыта. Добавьте еще газа, если он работает слишком медленно.

Теперь контракт cSai должен иметь разрешение на передачу 1 Sai от вашего имени.

2. функция мяты

Далее перейдите на страницу смарт-контракта cSai. Щелкните Подключиться к Web3 и снова войдите в MetaMask.

Поставляя свой Sai в контракт cSai с функцией монетного двора, вы можете получить обратно несколько отчеканенных токенов cSai.

function mint(uint mintAmount) returns (uint)

Укажите количество Саи, которое вы хотите добавить в функцию монетного двора.

Нажмите на кнопку «Написать» и отправьте транзакцию.

Вы должны быть в состоянии увидеть, что 1Sai вычитается, а некоторое количество cSai добавляется из / в вашу учетную запись.

3. функция redeemUnderlying

Есть два способа отозвать свой Саи. Вы можете указать количество Sai или количество cSai для обмена с Sai.

Функция redeemUnderlying принимает в качестве аргумента количество Sai. Функция выкупа берет количество cSai. Мы будем использовать здесь для простоты функцию redeemUnderlying:

function redeemUnderlying(uint redeemAmount) returns (uint)

Укажите сумму Саи, которую вы хотите вывести, в функции redeemUnderlying:

Нажмите на кнопку «Написать» и отправьте транзакцию.

Вы можете увидеть, что вы вернули cSai и вместо этого получили Sai.

Вы также должны увидеть, что в вашей учетной записи все еще есть небольшое количество cSai. Это тот процент, который вы накопили.

Настройка

Хорошо, приступим к нашему приложению. Опять же, мы создадим простое приложение JavaScript, которое одалживает и отзывает Сай. Вы можете увидеть этот репозиторий для готового кода.

Получите свой закрытый ключ и адрес
Сначала получите свой закрытый ключ и адрес в vanity-eth. Нажмите кнопку Создать внизу. Держите их пока где-нибудь. Пожалуйста, НЕ используйте их для других целей, кроме тестирования. Это небезопасно.

Получите Eth и Sai
Отправьте Eth и Sai по только что полученному адресу. 0.01 Эт должно хватить на оплату газа. В этом посте я поставлю только 1 Sai.

* Мы будем использовать cSai для основной сети, так как, к сожалению, получить токены Sai для тестовой сети сложно.

Получите конечную точку Infura
Мы будем использовать Infura в качестве провайдера для связи с сетью Ethereum. Создайте учетную запись Infura и получите конечную точку в Mainnet, создав новый проект. Это должно выглядеть примерно так:

https://mainnet.infura.io/v3/[PROJECT_ID]

Начать новый проект npm

mkdir eht-compound-demo
cd eht-compound-demo/
npm init --yes

* Если у вас нет npm и nodejs, установите их отсюда.

Инициализировать Git

git init

Установите пакет web3

npm i — save [email protected]

web3 - это API-интерфейс Ethereum JavaScript. Это интерфейс к сетям Ethereum. Он взаимодействует с узлом Ethereum или взаимодействует со смарт-контрактами, развернутыми в блокчейне из вашего приложения JavaScript.

Установите пакет ethereumjs-tx

npm i --save [email protected]

Мы используем ethereumjs-tx для создания и подписания транзакций.

Добавить скрипты в package.json

“scripts”: {
“approve-sai-main”: “node — experimental-modules ./approveSaiMain.mjs”,
“supply-sai-main”: “node — experimental-modules ./supplySaiMain.mjs”,
“withdraw-sai-main”: “node — experimental-modules ./withdrawSaiMain.mjs”
},

mjs - это расширение файла, которое позволяет писать с синтаксисом ES6.

Создайте файл saiTokenContract.mjs и файл cSaiContract.mjs
Вы можете просто скопировать файлы здесь и здесь.

В этих файлах я просто объявляю и экспортирую abi и адрес контракта токена sai и контракта cSai.

Реализуйте функцию, чтобы одолжить сай

Теперь приступим к написанию кода. Начнем с функции кредитования.

Мы сделаем два отдельных файла:

  1. approveSaiMain.mjs
  2. supplySaiMain.mjs

1. одобритьSaiMain.mjs

Создание нового файла
Создайте новый файл ApproveSaiMain.mjs.

Импорт пакетов

import Web3 from “web3”;
import EthTx from “ethereumjs-tx”;

Импорт cSaiContract и saiTokenContract

import cSaiContract from ‘./cSaiContract’;
import saiTokenContract from ‘./saiTokenContract’;

Настроить Web3
Настройте Web3 для использования Infura в качестве вашего провайдера web3:

const web3 = new Web3(
  new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/[YOUR_PROJECT_ID]"
  )
);

Объявите свой адрес и переменные закрытого ключа

const addressFrom = “[YOUR_ADDRESS]”;
const privKey = “[YOUR_PRIVATE_KEY]”;

Создание экземпляра контракта токена Sai
Вы используете Contract метод web3 с адресом и abi для создания экземпляра контракта токена Sai.

const saiTokenContractInstance = new web3.eth.Contract(
  JSON.parse(saiTokenContract.saiTokenContractAbi),
  saiTokenContract.saiTokenContractAddress
);

Теперь мы готовы вызвать методы контракта токена sai.

Объявление постоянных переменных для передачи функции утверждения

const ADDRESS_SPENDER = cSaiContract.cSaiContractAddress;
const TOKENS = web3.utils.toHex(-1);

Вы можете передать 1 * 10 ** 18 второму аргументу функции утверждения, но на практике принято передавать -1, чтобы пользователям больше не приходилось подтверждать. Если хотите понять, как это работает, прочтите this.

Закодируйте Abi для функции утверждения

const approveEncodedABI = saiTokenContractInstance.methods
  .approve(ADDRESS_SPENDER, TOKENS)
  .encodeABI();

Объявите функцию sendSignedTx
Создайте функцию для подписи объекта транзакции, а затем распространите ее в сеть Ethereum:

function sendSignedTx(transactionObject, cb) {
  let transaction = new EthTx(transactionObject);
  const privateKey = new Buffer.from(privKey, "hex");
  transaction.sign(privateKey);
  const serializedEthTx = transaction.serialize().toString("hex");
  web3.eth.sendSignedTransaction(`0x${serializedEthTx}`, cb);
}

Создайте объект транзакции, а затем выполните sendSignedTx

web3.eth.getTransactionCount(addressFrom).then(transactionNonce => {
  const transactionObject = {
    chainId: 1,
    nonce: web3.utils.toHex(transactionNonce),
    gasLimit: web3.utils.toHex(100000),
    gasPrice: web3.utils.toHex(5000000000),
    to: saiTokenContract.saiTokenContractAddress,
    from: addressFrom,
    data: approveEncodedABI
  };
sendSignedTx(transactionObject, function(error, result){
    if(error) return console.log("error ===>", error);
    console.log("sent ===>", result);
  })
}
);

Установите gasLimit на 100000. Вы можете изменить gasPrice, если хотите платить меньше. Ознакомьтесь с текущим оптимальным gasPrice в EthGasStation. Вы можете преобразовать его значение gwei в wei в Конвертере единиц Ethereum.

Запустить файл

npm run approve-sai-main

Как только вы получите хэш транзакции, подобный этому 0xa18d71767ba95b95831fbf3a441494165002bc5f4104afdb0406511ebce7cbe3, вы можете перейти в Etherscan, чтобы увидеть детали вашей транзакции. Ниже в качестве примера приведена моя транзакция. Если ваша транзакция не прошла, увеличьте свой gasPrice и отправьте еще одну транзакцию.

Вы можете видеть, что я вызвал функцию утверждения во «Входных данных».

2. supplySaiMain.mjs

Я создаю другой файл, supplySaiMain.mjs, и на этот раз вызываю функцию mint. Я опущу детали, так как большая часть кода останется прежней. Готовый код вы можете увидеть в репо.

Закодируйте abi функции mint количеством Саи, которое вы хотите чеканить.

const MINT_AMOUNT = web3.utils.toHex(1 * 10 ** 18);
const mintEncodedABI = cSaiContractInstance.methods
  .mint(MINT_AMOUNT)
  .encodeABI();

Передайте этот ABI свойству data в объекте транзакции. Кроме того, на этот раз установите gasLimit на 200000:

web3.eth.getTransactionCount(addressFrom).then(transactionNonce => {
  const transactionObject = {
    chainId: 1,
    nonce: web3.utils.toHex(transactionNonce),
    gasLimit: web3.utils.toHex(200000),
    gasPrice: web3.utils.toHex(5000000000),
    to: cSaiContract.cSaiContractAddress,
    from: addressFrom,
    data: mintEncodedABI
  };
sendSignedTx(transactionObject, function(error, result){
    if(error) return console.log("error ===>", error);
    console.log("sent ===>", result);
  })
}
);

Запустите файл:

npm run supply-sai-main

Вы можете видеть, что 1Sai переводится с вашего аккаунта. Вы также можете увидеть, что получаете взамен немного cSai.

Реализуйте функцию отзыва Саи

Наконец, мы собираемся создать функцию для вывода Сай. Опять же, я пропущу детали, так как большая часть кода останется прежней. Посмотреть готовый код можно здесь. Я создаю другой файл, withdrawSaiMain.mjs, и на этот раз вызываю функцию redeemUnderlying.

Закодируйте abi функции redeemUnderlying суммой Саи, которую вы хотите снять.

const REDEEM_AMOUNT = web3.utils.toHex(1 * 10 ** 18);
const redeemUnderlyingEncodedABI = cSaiContractInstance.methods
  .redeemUnderlying(REDEEM_AMOUNT)
  .encodeABI();

Передайте этот ABI свойству data в объекте транзакции. Кроме того, на этот раз установите gasLimit на 400000:

web3.eth.getTransactionCount(addressFrom).then(transactionNonce => {
  const transactionObject = {
    chainId: 1,
    nonce: web3.utils.toHex(transactionNonce),
    gasLimit: web3.utils.toHex(400000),
    gasPrice: web3.utils.toHex(5000000000),
    to: cSaiContract.cSaiContractAddress,
    from: addressFrom,
    data: redeemUnderlyingEncodedABI
  };
sendSignedTx(transactionObject, function(error, result){
    if(error) return console.log("error ===>", error);
    console.log("sent ===>", result);
  })
}
);

Запустите файл:

npm run withdraw-sai-main

Вы можете увидеть, что получили обратно свой 1Sai и отправили немного cSai обратно в контракт cSai.

Когда вы видите свой баланс cSai, у вас все еще есть небольшая сумма. Это тот процент, который вы накопили.

Резюме

Мы узнали, что Compound - это децентрализованный протокол кредитования на блокчейне Ethereum, который позволяет всем в мире ссужать или занимать криптоактивы без разрешения. Поскольку он исключает затраты на координацию и переговоры, его намного проще и быстрее использовать по сравнению с другими существующими системами крипто-кредитования p2p.

Мы также узнали, что кредитование и снятие средств в Compound так же просто, как вызов трех методов в смарт-контрактах. Вы можете интегрировать это простое приложение в свое децентрализованное приложение или кошелек, чтобы ускорить революцию в области открытых финансов.

Я надеюсь, что теперь мы разделяем волнение экономики обмена криптовалютой.