0x00 начало
Когда большинство людей изучают разработку смарт-контрактов, они выбираютremix
Разработка и внедрение контрактов. remix
установленSolidity
Редактор, компилятор и интегрированный инструмент разработки, развернутые в одном, очень удобны и очень просты в использовании. использовал раньшеRemix
или truffle
,Недавно использованныйweb3
Разверните смарт-контракты и поделитесь ими.
0x01 Подготовка
в настоящее время используетweb3
Для развертывания по контракту обычно необходимо подготовить следующие библиотеки:
1. раствор
solc
Это инструмент компиляции смарт-контрактов, разработанный на языке Solidity, официально выпущенный Ethereum.solc
Получите тот, который будет использоваться при развертывании контрактаbytecode
и abi
.
2. веб3.js
web3.js
Это использование официальной реализации Ethereum.javascript
js библиотека для взаимодействия с клиентом Ethereum,web3
.js
Работает с любым узлом Ethereum, который предоставляет уровень RPC.
0x02 Использовать Solidity для написания кода смарт-контракта
В этой статье в основном обсуждается развертывание смарт-контракта web3 и не затрагивается обсуждение языка солидности, поэтому мы используем очень простой смарт-контракт, чтобы изучить следующее развертывание и записать свое имя в блокчейн:
pragma solidity ^0.4.16;
contract Name {
string public name;
// 构造函数 合约部署时执行
function Name(string _name) public {
name = _name;
}
// 获取名字
function getName() view public returns(string) {
return name;
}
}
скопировать код
0x03 Использовать solcjs для компиляции смарт-контрактов
Если вы хотите использовать web3 для развертывания контракта, вам нужно сначала получить байт-код контракта и abi контракта, а для компиляции можно использовать solcjs.
npm install -g solc
скопировать код
После успешной установки мы можем скомпилировать код через командную строку, чтобы получить код и abi.
# 获得code
solcjs --bin name.sol
# 获的abi
solcjs --abi name.sol
скопировать код
Внедрение 0x04 web3 перед развертыванием
1. Представьте web3.js
Вводитьweb3.js
Есть два способа: один с использованием nodejs и один с использованием движка браузера напрямую.
nodejs
npm install web3
скопировать код
Browser module
# 项目中直接引入 `web3.min.js`
bower install web3
скопировать код
2. Как пользоваться веб3
фактически web3
для Эфириумаjson
-rpc
использование интерфейсаjavascript
После упаковки, так какrpc
, когда мы его используем, мы должны подключиться к серверу, который поддерживает Ethereum.json
-rpc
узел. Здесь мы обычно подключаемjson
-rpc
Узлы называются внедряющими узлами Ethereum. Есть два способа внедрения узлов.
- Внедрить собственный узел или открытый узел
Для инъекций таким способом нам нужно построить собственную ноду и взаимодействовать с сетью Ethereum через нашу собственную ноду Код выглядит следующим образом:
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
скопировать код
один из них http://localhost:8545
Это адрес вашего собственного узла, но поскольку объем данных полного узла Ethereum увеличивается, для синхронизации данных полного узла требуется очень много времени и большой объем жесткого диска, что очень проблематично для обычных пользователей. .
В настоящее время есть некоторые открытые поставщики услуг, которые предоставляют полные узлы и тестовые сетевые узлы.На самом деле, это проще в использовании.Вы можете не синхронизировать всю сеть Ethereum самостоятельно, и вам нужно только сосредоточиться на разработке собственных приложений для обеспечения служба узла. Эту услугу предоставляют многоцепочечные узлы в рамках технологии Multi-Chain.
// 多链节点
https://node.duolian.io/
скопировать код
- Используйте плагины для браузера, такие как MetaMask
MetaMask – это подключаемый модуль браузера для кошелька Ethereum. Этот подключаемый модуль предоставляет собственный экземпляр web3. Когда пользователь устанавливает MetaMask в браузере, MetaMask автоматически внедряет фрагмент js, а затем внедряет собственный экземпляр web3 в браузер. так что вы можете использовать этот экземпляр web3 напрямую. код показывает, как показано ниже:
web3 = new Web3(web3.currentProvider);
скопировать код
Внедрить код web3
Когда в браузере уже есть экземпляр web3, то мы напрямую используем существующий экземпляр, а если его нет, подключаемся к собственному экземпляру web3.
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
скопировать код
0x05 Разверните контракт через web3
Код и abi контракта получены через solcjs, и web3 успешно внедряется в браузер.На данный момент нам нужно только развернуть контракт через web3.
var _name = /* var of type string here */ ;
var nameContract = web3.eth.contract("使用solcjs编译获得的abi");
var name = nameContract.new(
_name,
{
from: web3.eth.accounts[0],
data: '使用solc编译获得的code',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
скопировать код
0x06 Окончательный код
Поскольку в этой статье используется экземпляр web3 MetaMask во время развертывания, поскольку web3 MetaMask не поддерживает синхронные вызовы, код при создании экземпляра web3 отличается, и соответствующий код js выглядит следующим образом:
var Web3 = require('web3');
getWeb3 = new Promise(function(resolve) {
window.addEventListener('load', function() {
var results;
var web3 = window.web3;
if (typeof web3 !== 'undefined') {
// Use Mist/MetaMask's provider.
web3 = new Web3(web3.currentProvider);
results = {
web3: web3
};
console.log('Injected web3 detected.');
resolve(results);
} else {
alert('请安装MetaMask插件并解锁您的以太坊账户');
}
})
});
var web3;
getWeb3.then(function(results) {
web3 = results.web3;
});
// 部署的方法
function deploy()
{
var _name = "二话区块链" ;
var nameContract = web3.eth.contract(使用solc编译获得的abi);
var name = nameContract.new(
_name,
{
from: web3.eth.accounts[0],
data: '使用solc编译获得的code',
gas: '288628',
gasPrice: 4
}, function (e, contract){
console.log(e, contract);
if (e !== 'undefined') {
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
} else {
console.log('Contract mined! transactionHash: ' + contract.transactionHash);
}
}
});
}
скопировать код
Спасибо за вашу поддержку, если вы думаете, что это хорошо, пожалуйста, перешлите его~
Если тебе это нравится, не говори, просканируй меня~