Мне интересно, есть ли примеры случаев, когда было бы целесообразно использовать типичное клиент-серверное приложение Node.js, в котором узел блокчейна будет работать на сервере. На первый взгляд, это вернет проблемы централизации, связанные с доверием к серверу, если это сам сервер, на котором работает узел. Однако мне было интересно, есть ли реальные случаи, когда это было бы уместно (здесь есть вопросы людей, которые, кажется, делают это - например , это ).
Для дальнейшего разъяснения: я прочитал этот пост, в котором утверждается, что инструменты, необходимые для разработки Dapp, еще не собраны. Таким образом, мне было интересно подумать об альтернативах, которые все еще могли бы использовать функции надежности блокчейна и т. Д., Но работали в рамках клиент-серверной среды.
Я думаю, что ответ @JohnAllen не имеет для меня смысла. Наиболее распространенная практика заключается в том, чтобы интерфейсный пользовательский интерфейс DApp был реализован как приложение NodeJS, которое использует библиотеку Javascript Web3 для связи с узлом Ethereum, работающим локально, то есть на том же сервере, что и приложение NodeJS.
Здесь сервер NodeJS сам по себе не запускает узел Ethereum. (Позаботьтесь о том, чтобы различать два варианта использования термина «узел» здесь). И узел Ethereum (который может быть geth, Parity, pyethapp или любое другое клиентское программное обеспечение Ethereum), и приложение NodeJS работают на одной и той же машине. Узел Ethereum — это клиент блокчейна Ethereum, с которым он синхронизирован. Приложение NodeJS, взаимодействующее с локально работающим узлом Ethereum, фактически снижает централизацию, поскольку различным приложениям не нужно доверять какому-то конкретному удаленному узлу Ethereum. Кроме того, учетные записи всегда создаются на локальном узле, поскольку сгенерированные закрытые ключи должны оставаться на локальном компьютере. Команды для создания учетных записей и управления ими находятся вweb3.eth.personal
интерфейс, который по умолчанию включен только через IPC (межпроцессное взаимодействие), т.е. может работать только на локальном узле Ethereum.
ДОПОЛНЕНИЕ . Если внешний интерфейс DApp обслуживается приложением NodeJS, работающим на определенном сервере, это вводит некоторую централизацию. Однако до тех пор, пока DApp все еще может поддерживать состояние своей модели (используя «модель» в смысле MVC), даже если сервер NodeJS выходит из строя, и если кто-либо еще может разместить приложение NodeJS, таким образом восстанавливая «представление» MVC и предоставление доступа к серверной части (код контракта, развернутый на блокчейне), то недостаток централизации сводится к минимуму. Итак, я хочу сказать, что централизация/децентрализация не является классификацией черного или белого. Любое приложение лежит где-то на спектре. DApp можетчтобы его пользовательский интерфейс также обслуживался децентрализованно, например, я слышал, что для этого предлагались Swarm и IPFS, но я не знаю более подробной информации о том, как это будет сделано. Все зависит от конкретного случая и от того, насколько децентрализация действительно нужна.
Это в основном не имеет смысла для меня, вот почему:
где узел блокчейна будет работать на сервере
Определение a blockchain node
— это один из многих тысяч узлов Ethereum, которые хранят данные блокчейна и часто отвечают на запросы об этих данных.
Итак, когда у вас есть архитектура с сервером Ethereum node
и Node.js
клиентом, что будет делать сервер Node.js?
Обычно Node.js
используется для ответа на запросы со стороны сервера, выполнения логики и запросов к централизованной базе данных; но с Dapps блокчейн и web3
(который является серверной или клиентской библиотекой) запрашивают данные блокчейна, а узел Ethereum отвечает запрошенными данными, которые затем возвращаются клиенту.
Вы упоминаете о хранении данных в Node.js
комментарии. Другой вариант — хранить данные централизованно или IPFS. Вы можете хранить простой хэш или CID (идентификатор контента) в цепочке, а данные, на которые указывает хеш, в централизованной базе данных, запрашивать хэши, хранящиеся в цепочке (содержимое которых закодировано в хеше), запрашивать ваши данные. по хэшу, запустите ту же хеш-функцию для запрошенных данных, чтобы убедиться, что они одинаковы, а затем верните эти данные вашему клиенту.
rehashing
, чтобы пользователи могли убедиться, что контент одинаков.if the server is the one running the node
<- Вы имеете в виду, что если geth node
сервер и сервер Node.js работают на одном компьютере, хэш может быть скомпрометирован на пути к хранению в цепочке? Вероятно, это так, но тогда в принципе все может быть скомпрометировано. Просто помните Node.js
сервер и geth node
это две совершенно разные вещи
.В децентрализованном мире имеет смысл иметь узлы блокчейна в самых разных местах. Иногда у вашего клиента будет доступ к одному, иногда нет. Будем надеяться, что они будут появляться все чаще и чаще, но пока мы ждем более легких клиентов и более масштабируемых сетей, очень важно рассмотреть случаи, когда вы, возможно, захотите также запустить клиент блокчейна на сервере.
Действительно, клиенты блокчейна на стороне клиента действительно имеют смысл только тогда, когда пользователь — человек с веб-браузером. В любой межмашинной транзакции процесс NodeJS имел бы больше смысла.
Кроме того, хотя Web3 очень удобен, поскольку API может уже существовать в браузере пользователя, он далек от оптимального API поиска. Вы можете запустить узел на стороне сервера только для индексации информации, относящейся к вашему приложению, чтобы вы могли быстрее предоставлять ее пользователям.
Что касается подписи, я определенно считаю, что безопаснее оставить ключи в руках пользователя, но вполне разумно ожидать, что некоторые службы будут подписывать от имени пользователя из процесса на стороне сервера.
Клиент блокчейна — это просто некоторое программное обеспечение, которое позволяет другому контексту получить доступ к блокчейну. В нем нет ничего, что принуждало бы его к тому или иному контексту, и если децентрализованная сеть действительно взлетит и обеспечит масштабируемость и производительность, я думаю, что более сложным вопросом станет ответ на вопрос: «В каком контексте вы бы никогда не хотели, чтобы клиент блокчейна в?"
Мне было интересно подумать об альтернативах, которые все еще могли бы использовать функции надежности блокчейна и т. Д., Но работали в рамках клиент-серверной среды.
Вы можете создавать гибридные веб-приложения, которые используют Python/Node/что-то еще в качестве централизованного внутреннего сервера для одних задач и используют блокчейн для других задач.
Упрощенным примером гибридных децентрализованных приложений может быть децентрализованное приложение для залога токена ERC20 в обмен на ETH. Теперь кредитор и заемщик хотят обсудить процентные ставки и срок кредита. Заемщик также хочет знать, готов ли кто-нибудь предложить ему более выгодные ставки. Этот процесс обнаружения может происходить через централизованную службу без необходимости тратить ETH на газ для каждого сообщения. На этом этапе может существовать определенная цензура, когда кредиторы, предлагающие более низкие ставки, по какой-то причине вам не показываются, но вы не берете на себя никакого риска и все еще можете отказаться от процесса.
После завершения переговоров и кредитор, и заемщик могут просто нажать кнопку на веб-странице и создать смарт-контракт на блокчейне, который содержит информацию обо всех условиях ипотеки и будет вести себя соответствующим образом. На этом этапе вам не нужно доверять централизованному веб-сайту или кредитору в обеспечении безопасности вашего залога, поскольку он будет заблокирован в контракте.
Таким образом, на одном этапе вы жертвуете недоверием ради скорости и стоимости, а на другом используете недоверие ради безопасности.
Конечно. Например, представьте, что у вас есть интернет-магазин (например, по продаже смартфонов), написанный на node.js. Вы хотели бы подключить его к блокчейну, чтобы контролировать, например, платежи. Таким образом, клиенты будут платить по вашему адресу через Metamask или Mist, а серверная часть вашего магазина будет подключена к узлу Ethereum (который может быть на том же сервере), чтобы проверить, был ли платеж выполнен, и продолжить выполнение заказа.
В этом случае сервер с узлом ethereum не является способом централизации приложения, это просто способ доступа к смарт-контрактам/учетным записям компьютерной системой, а не самим человеком.
Макансадо
const web3 = new Web3(new Web3.providers.HttpProvider(provider));
всегда будет в коде на стороне клиента, а не в коде на стороне сервера. Это правильно?ДжонАллен
Аджой Бхатия
Аджой Бхатия
web3
объект может быть либо в клиентском, либо в серверном коде, ссылаясь на дополнение к моему ответу. Это будут разные уровни централизации. Я думаю, что если вы используете браузер Mist, тоweb3
объект находится только на стороне клиента.аутсайдер
Аджой Бхатия