Agosto de 2018

Volume 33 – Número 8

Blockchain – Conceitos Básicos do Blockchain: Detalhes das Cadeias de Hash da Transação

Por Jonathan Waldman | Agosto de 2018

No primeiro artigo desta série (msdn.com/magazine/mt845650), apresentei os conceitos fundamentais necessários para compreender amplamente blockchains e moderno, usando exemplos de alto nível para ilustrar os conceitos básicos. Neste artigo, voltarei a alguns dos tópicos do artigo anterior, em mais detalhes sobre cadeias de hash de transações, a função do pool de transações e como um blockchain mais longo sempre prevalecerá. Este artigo é mais bem lido como um suplemento para o artigo anterior e contém o material introdutório para desenvolvedores novos às tecnologias de blockchain.

A propósito, embora os artigos desta série se baseiam no blockchain do Bitcoin, não estou defendendo a adoção de uma tecnologia ou produto de blockchain em especial. Em vez disso, meu objetivo é explorar a base na qual blockchain popular tecnologias foram criadas e equipar os dados de conhecimento que você pode aplicar se você decidir utilizar blockchains existentes ou a engenharia de seu próprio. Conforme você estude os blockchains, você perceberá em breve que detalhes de implementação são muito diferem entre eles. Se você decidir especializados em uma implementação de blockchain em especial, será preciso acompanhar suas correções e atualizações para manter a experiência. Mas devo avisá-lo a natureza dinâmica dessas tecnologias emergentes geralmente significa que esse livros disponíveis, vídeos, blogs, fóruns e outro outono de recursos de documentação atrás, às vezes, sendo necessário consultar o código-fonte mais recente implantado como um determinado referência definitiva da implementação de blockchain.

Cadeia de Hash de transação revisitada

Meu artigo anterior abordou a transação hash cadeia estrutura de dados, que controla a propriedade do ativo digital. Neste artigo, vou me aprofundar mais profundamente em como funciona essa cadeia de hash.

Para pagar uma homenagem ao raízes do blockchain, vou começar se concentrando em seminal white paper de Satoshi Nakamoto sobre Bitcoin (bitcoin.org/bitcoin.pdf) publicado em 31 de outubro de 2008 — meses antes do lançamento do Bitcoin no dia 3 de janeiro de 2009. Embora Bitcoin detalhes da implementação foram alterados um pouco desde então, o white paper permaneça uma referência útil, especificamente o diagrama em 2 de p. que expressa a cadeia de hash da transação original design conceito.

A finalidade do diagrama é transmitir como uma cadeia de hash de transação é construída e assinaturas digitais autorizam a transferência da sequência de propriedade. No entanto, é altamente abstraído e, dessa forma, é um pouco confuso. Para dar maior clareza, criei uma versão mais detalhada que descreve como atual cadeias de hash de transações realmente funcionam (consulte Figura 1).

Versão atualizada do diagrama de cadeia de Hash de transação Original de Satoshi Nakamoto
Figura 1 versão atualizada do diagrama de cadeia de Hash de transação Original de Satoshi Nakamoto

Meu diagrama revisado mostra três transações (baseado em 0, como no documento original): Transação0) para Alice, transação1 para transações e Bob2 para Charlie. A primeira transação estabelece Alice o proprietário original do ativo digital; sua segunda transação transfere a propriedade a Bob; e sua transação terceiro transfere a propriedade para Charlie. Cada transação é composta por esses campos (mostrados com um contorno sólido): o hash de transação, a ID do ativo digital, dados opcionais, chave pública e assinatura. Outros campos são usados, mas não são armazenados na transação (mostrada com um contorno pontilhado): chave privada e o novo hash de transação. O diagrama expressa os valores de campo como nomes de maiusculas e minúsculas subscritos — por exemplo, o valor de hash de transação para transações0) é TransactionHash0) e o valor de chave pública para a transação2 é PublicKey2.

Figura 1 é a cadeia de hash de uma transação simplificada porque ele acompanha apenas um único ativo digital (DigitalAssetID0)) como ele altera a propriedade (por outro lado, cadeias de hash de transações de criptomoeda normalmente têm vários ativos digitais entradas e saídas). Além disso, não confunda a cadeia de hash de transação com o blockchain, que agrega verificado transações em blocos. Por fim, a cadeia de hash de transação geralmente não é armazenada como a estrutura de dados de lista vinculada única representada. Em vez disso, ela pode ser construída (rapidamente, com o auxílio de índices) dos dados de transação que são armazenados no blockchain.

Como descrevi no meu artigo anterior, a sequência de transações é preservada porque a transação do cada novo proprietário contém um valor de hash é vinculados de volta à transação anterior do proprietário. Na Figura 1, vínculos inversos são formados quando o hash de transação da transação anterior é armazenado na transação atual. Por exemplo, a transação de Bob contém um campo de hash de transação que contém TransactionHash de Alice0) valor; da mesma forma, a transação do Charlie contém um campo de hash de transação que contém TransactionHash de Bob1 valor e assim por diante.

Back-links são apenas um dos vários componentes de integridade de dados da cadeia de hash de transação. A cadeia também impõe transferir a propriedade de autorização. Para seguir um exemplo, imagine que Alice é um purveyor de degustação de vinhos melhores do mundo e deseja manter um razão que controla a sina de cada bottle, que ela é a proprietária. Um dia, Alice vai para ela cellar vinho e decide a que ela serão registrados por conta própria no blockchain de sua empresa como o proprietário original de cada garrafa de vinhos em estoque, efetivamente a propagação cadeias de hash de transações para cada uma das suas preferidas garrafas de vinhos. Para começar, ela casualmente captura uma garrafa de Saint-Émilion Cheval Blanc 1947 e marca-a com um código QR que contém uma ID exclusiva. Ela verifica, em seguida, o rótulo QR em seu software de cliente de blockchain em execução como um nó na rede. O software converte o código digitalizado em uma ID de ativo digital (DigitalAssetID0)), em seguida, adiciona dados opcionais (OptionalData0)), juntamente com a chave pública de Alice (PublicKey0)). Como você pode ver na Figura 1, esses campos estão em sua próprias contornado retângulo que representa uma transação sem sinal. Cada transação também contém um hash de transação back-link e uma assinatura, mas como esta é a primeira transação na cadeia de hash, esses campos estão em branco (mostrados pelos campos sombreados por transação0)).

Mostrado acima de cada transação é um valor de hash de transação exclusivo que o software cliente calcula, SHA-256-hashing junto todos os campos de transação (o hash de transação, a ID do ativo digital, dados opcionais, do proprietário chave pública e assinatura). Novamente, é esse valor de hash de transação que é usado como um link da próxima transação back para DigitalAssetID0).

Quando Bob, o gerente do restaurante de Manhattan de Alice, quer adquirir garrafa de Alice de Cheval Blanc, ele usa seu software de cliente para gerar um novo par de chaves pública / privada para a transação. Bob pode ignorar esta etapa e agregar todos os seus ativos digitais em uma única chave pública usada anteriormente, mas que poderia expor em contato com ele a riscos desnecessários. Em vez disso, ele gera um novo par de chaves e fornece uma chave pública, que ele nunca é usado antes de Alice. Dessa forma, se ele nunca perder a chave privada emparelhada, ele perde o acesso a apenas um único ativo digital.

Em resposta à solicitação de Bob, Alice inicia seu software de cliente e navega por ela ativos digitais. Ela seleciona a transação ID associada com o bottle Cheval Blanc Bob deseja e, em seguida, inicia a solicitação de transferência, fornecendo a chave pública de Bob, que dobra como um tipo de endereço de destino. O nó, em seguida, cria uma nova transação (transações1) que contém o valor de link de voltar do hash de transação anterior (TransactionHash0)), o valor da ID do ativo digital (DigitalAssetID0)) para o bottle Cheval Blanc (Isso é o mesmo valor que a ID do ativo digital para transações0)), o valor para todos os campos personalizados relacionados à transação (OptionalData1) e o valor da chave pública de Bob (PublicKey1) porque Bob é proprietário dessa transação.

Até agora, o nó foi construído uma nova transação não assinada1 para Carlos. A próxima etapa é assinar a transação usando a chave privada de Alice. Essa é uma etapa crítica: Alice atualmente possui o ativo digital em questão apenas que ela pode autorizar a transferência desse ativo para Bob.

Criptografia de curva elíptica

Na Figura 1, rótulos 1 e 2 indicam onde a transação é assinada e onde ele é verificado, respectivamente. Em sua versão atual, o blockchain do Bitcoin utiliza uma implementação de criptografia de chave pública (PKC) chamada criptografia de curva elíptica (ECC). ECC fornece resultados de criptografia mais fortes e chaves mais curtas que a alternativa RSA/Diffie-Hellman popular. Nós de Blockchain usam ECC para gerar pares de chaves assimétricas usando uma fórmula que envolve pontos selecionados aleatoriamente em um gráfico bidimensional. Esse esquema permite que uma chave pública perdida ao ser regenerado a partir a chave privada (mas certamente não permite que uma chave privada perdida ao ser regenerado a partir de uma chave pública).

Os Blockchains modelada Bitcoin também aproveitar ECC quando se trata de assinaturas digitais. Ao contrário dos exemplos PKC Rivest-Shamir-Adelman (RSA) simplificada, ilustrada no meu artigo anterior, Bitcoin agora usa um ECDSA Digital curva elíptica assinatura algoritmo () (especificamente, SHA256withECDSA) para transações de assinatura. Esse algoritmo funciona um pouco diferente de outras tecnologias de autenticação: Em ECDSA, você deve passar a chave privada do signatário junto com a mensagem a ser assinado para uma função que usa um algoritmo de geração de assinatura ECDSA para criar uma assinatura (essa etapa é indicada pelo marcador 1 em Figura 1). Para verificar a assinatura mais tarde, você deve passar a chave pública do signatário, mensagem e assinatura para uma função que usa um algoritmo de verificação de ECDSA para gerar um valor true ou false, que indica se a assinatura é válida (o nesta etapa é indicada pelo marcador 2 na Figura 1). Figura 2 resume assinar e verificar usando ECDSA.

Geração de assinaturas de algoritmo de Assinatura Digital de curva elíptica (superior) e o algoritmo de verificação (inferior)
Geração de assinaturas de algoritmo para Assinatura Digital de curva elíptica Figura 2 (superior) e o algoritmo de verificação (inferior)

Ao criar uma assinatura digital usando o RSA PKC, você verificar a assinatura, comparando valores de hash, conforme mostrado no meu artigo anterior. Para o curioso tendo em mente, essa estratégia de verificação de assinatura não é possível com ECDSA. RSA PKC é um algoritmo de assinatura digital determinística porque a assinatura da mensagem fornecida com uma determinada chave privada gera a mesma assinatura cada vez. ECDSA, por outro lado, é não determinística: Cada vez que você passe uma mensagem e uma chave privada para o ECDSA assinatura de função, você obterá uma assinatura diferente. Para ver isso em ação, vá para bit.ly/2MCTuwI.

Continuando o exemplo, Alice está prestes a inscrever a transação que transfere a propriedade do DigitalAsset0) a Bob. O software de nó passa sua chave privada (PrivateKey0)) juntamente com uma mensagem (NewTransactionHash1) para a função do algoritmo de geração de assinaturas ECDSA e obtém uma assinatura como saída (assinatura1). O nó adiciona esse valor de assinatura para o campo de assinatura da nova transação. Por fim, o nó calcula o hash de transação (TransactionHash1) valor, que é um hash SHA-256 de todos os campos de transação, incluindo a assinatura. Nesse ponto, o nó produziu com êxito uma transação com sinal que pode ser enviada para o pool de transações.

Uma transação com sinal é considerada não verificados até que ela foi validada por um nó de mineração. Quando um nó de mineração tenta verificar a transação de Bob, ele usa o hash de transação back-link para acessar a chave pública da transação anterior, que leva a transação de Alice0). Depois que o nó tem acesso para a transação anterior, ele passa a chave pública da transação (PublicKey0)), juntamente com o novo hash de transação (NewTransactionHash1) e a assinatura na transação de Bob (assinatura1) para o algoritmo de verificação de ECDSA que retorna um valor true ou false, que indica se a assinatura é válida.

Por acaso, de Alice chave privada (PrivateKey0)) e o novo hash de transação (NewTransactionHash1) não são armazenados na transação. Valores de chave privadas não devem ser armazenadas em um blockchain, e não é necessário para armazenar o novo valor de hash de transação, porque ele pode ser recalculado sempre que necessário.

Bob captura sua corkscrew e achar que ele vai savor o Cheval Blanc quando ele recebe uma chamada do Skype do Charlie, o Gerenciador de um dos outros restaurantes de Alice. Charlie quer oferecer uma garrafa especial de vinhos bem-vindo um sommelier contratado recentemente. Bob regretfully concorda em transferir a propriedade de Blanc a Cheval para Charlie. Ele solicitará a chave pública do Charlie, e o mesmo processo é executado novamente para transferir DigitalAsset0) propriedade de Bob para Charlie.

Agora existem três transações para DigitalAsset0)— um para Alice, uma para Bob e outro para Charlie. Cada transação foi verificada e incorporada do blockchain. Depois que um determinado número de blocos adicionais explorou na parte superior do bloco que contém uma transação específica, que a transação seja considerada confirmada (esse "determinado número" é específico da implementação). Portanto, o proprietário oficial de determinado ativo digital sempre é a pessoa que tem a chave privada para a transação confirmada mais recentemente para a cadeia de hash de transação do ativo digital.

A necessidade de consenso

Como você viu, uma cadeia de hash de transação é uma estrutura de dados que se esforça para impor a propriedade de um ativo digital. Mas lembre-se de que essas transações são armazenadas em uma rede distribuída, descentralizada, assíncrona, pública que é vulnerável a ataques e expostas a nós que não necessariamente respeitam as regras de protocolo do blockchain (chamados "atores ruins"). O resultado é que nós atores ruins podem verificar as transações que não são válidas, na verdade, ou poderiam conspirem na rede para prejudicar a integridade do blockchain.

O Pool de transações para evitar esses problemas de integridade da transação, todas as transações de passar por um processo de verificação e a confirmação. Cada transação é criada por um único nó em algum lugar na rede. Por exemplo, suponha que Alice está em Belém e Bob está em Boston. Quando Alice transfere a propriedade do seu ativo digital para Bob, transação1 é construído por um nó no Belém e difusão para outros nós na rede. Ao mesmo tempo, outros nós ativamente difundir as transações que acabou de criar. Essas transmissões se espalhar para outros nós em uma rede global e leva tempo para propagar essas transações devido à latência de rede. Independentemente de onde na rede global uma transação se origina, o protocolo de blockchain coloca todas as novas transações em um pool de transação de transações não verificados.

Prova de trabalho e prova de jogo em um blockchain que emite um prêmio para prova de trabalho, nós miner agressivamente selecionar transações do pool de transações. Cabe no nó de mineração para verificar cada transação durante a construção de um bloco candidato porque um bloco que contém qualquer transação incorreta serão imediatamente rejeitado por outros nós — e isso significa que o trabalho feito pelo nó era para naught.

Lembre-se do meu artigo anterior que cada nó está em uma corrida para localizar um nonce para o bloco de candidato que construiu para poder ganhar um prêmio financeiro e recuperar os custos de energia incorridos durante a prova de trabalho de demonstração. A partir da redação deste artigo, a recompensa financeira atual no blockchain do Bitcoin é 12,5 Bitcoin (BTC), que equivale a aproximadamente US $ US $100.000. Às vezes, a recompensa financeira é uma taxa de transação e, às vezes, é uma recompensa financeira mais uma taxa de transação. O que é importante para entender sobre a prova de trabalho é que nós devem gastar a energia e incorrer em custos de infraestrutura e equipamentos para continuar a lucratividade blocos de mineração; para um nó seja sustentável, esses custos devem ser deslocados por receita.

Ele não é surpresa, em seguida, que, assim que um miner localiza um nonce ele imediatamente transmite esse bloco para todos os outros nós na rede, na esperança de que seu bloco minados just é adicionado ao final do blockchain. O blockchain do Bitcoin Calibra seu nonce dificuldade para que os novos valores de uso único são descobertos aproximadamente a cada 10 minutos, portanto, um atraso de até mesmo alguns segundos pode significar miner outro também pode encontrar um nonce e transmitir seu bloco candidato.

Para avaliar as implicações de perder a disputa de mineração, considere os nós de mineração que não encontrou um nonce em tempo: Toda a energia consumidos por eles foi desperdiçada. Os mineradores de que não foi possível encontrar um nonce não tem escolha senão ao parar o processamento do bloco atual e começar tudo captando e verificando as transações do pool de transações. O motivo pelo qual que eles devem parar mineração assim que eles Saiba que outro mineração encontrada um nonce é que um bloco candidato tem um vínculo regressivo para o hash do bloco anterior do blockchain. Quando outro miner mina um bloco verificado que vincula-se ao bloco anterior, os mineradores perdedora devem criar um novo bloco que referencia o hash para o bloco recém extraído. Os mineradores perdedora também devem descartar as transações previamente selecionado e escolha um novo conjunto do pool de transações, pois outros nós rejeitará qualquer novo bloco que contém transações já incluídas em um bloco anterior.

Um nó deve ter todos os custos necessários para dar suporte a seu equipamento de mineração. Como o blockchain do Bitcoin cresceu, isso levou a outro tipo de corrida — uma corrida para o equipamento mais avançado de mineração. A mais potência de computação que pode acessar um nó de mineração, mais provavelmente ele pode ganhar a corrida cada 10 minutos para resolver o Enigma criptográfico necessário para localizar um nonce.

Uma crítica comuns da prova de trabalho é que ele incentiva a construção de cada vez mais-potentes centros de computação e o uso crescente de valores de energia elétrica. Uma vantagem competitiva é fornecida para o proprietário dos equipamentos de computação mais poderosa em redes de blockchain de prova de trabalho fornecida. Por exemplo, data centers de dólar multimillion agora trabalhar exclusivamente em direção à mineração bitcoin. Acordo com a digiconomist.net, anual blockchain o consumo de energia do Bitcoin a partir de junho de 2018 é TWh 71.12, que é semelhante ao consumo de energia do Chile anual (bit.ly/2vAdzdl).

Outro algoritmo de consenso amplamente discutido é uma prova do jogo, que nós que demonstram uma relação com a rede econômica de recompensa. Indiscutivelmente, apelo do prova-de-stake maior é que ele é mais eficiente de energia. Além disso, ele não emitirá um prêmio de criptomoedas para mineração de um bloco, embora ele emitir taxas de transação como um prêmio. Ele também não requer uma corrida para localizar o nonce que resolve um enigma criptográfico. Em vez disso, a rede seleciona aleatoriamente um nó que se registrou como um "forger" (análogo ao "Miner" do Bitcoin) com base no valor total e idade de suas unidades de criptomoeda. Diversos detalhes de implementação se esforçar para garantir a Equidade e aleatoriedade no selecionando entre forgers. Por exemplo, depois de selecionar um forger ele geralmente não pode participar outra rodada de Preparando-se para pelo menos 30 dias. Na verdade, nós forger de alto valor que contém as moedas de criptomoeda mais antigas tem uma borda em outros nós forger.

Defensores de prova de jogo tornar o bom ponto em que o custo da execução de um nó é muito menor, incentivando uma participação maior e um nível maior de descentralização. Ironicamente, no entanto, sistemas de prova do jogo não recomendamos o uso da criptomoedas esse blockchain destina-se para a transação porque gastos reduzirá o valor do nó total e diminuir a chance de serem selecionados como um forger.

Uma coisa a considerar é o ponto feita pelo Especialista de blockchain Andreas Antonopoulos: "Prova de trabalho também é um prova do jogo, mas o prova de jogo também não é uma prova de trabalho". Ele explica o que prova de trabalho oferece uma combinação de ambos os algoritmos de consenso, tornando o ponto que enquanto mineradores participando de uma rede de prova de trabalho fornecida não estiverem selecionados com base no número ou a idade das unidades de criptomoeda, nós de mineração com eficiência Demonstre seus investimentos econômico da rede de energia necessária para participar de financiamento. Assim, o "jogo" no esquema de prova de trabalho, ele afirma, é o custo de um nó está disposto a incorrer em um esforço para com êxito meu um bloco de eletricidade (Assista Antonopoulos palestrando em um Meetup do vale do silício Bitcoin em 13 de setembro de 2016: bit.ly/2MDfkA1).

Cadeia mais longa a rede de blockchain constantemente estende, branches e remove a mesmo. Toda a exibição do blockchain é chamada de árvore de bloco; cada nó de mineração ativamente mina contra o bloco que encerra a cadeia mais longa da árvore de bloco. Você pode pensar que a cadeia mais longa é definida pela cadeia com o maior número de blocos, mas ele é definido como a sequência de blocos da gênese do bloqueio que produz a maior quantidade de trabalho. Você pode derivar o trabalho total, somando dificuldade "para" de cada bloco — uma medida de como provavelmente não é descobrir um nonce para um bloco candidato. O protocolo de rede mantém esse valor, que ajusta o blockchain do Bitcoin cada 2,016 blocos para que blocos levar aproximadamente 10 minutos de processamento de tempo para explorar. O valor de dificuldade é armazenado em cada bloco para que o trabalho pode ser calculado por nós que estão tentando para identificar a cadeia mais longa.

Ocasionalmente, é inevitável que dois nós, A e B, demonstrará a prova de trabalho por um novo bloco de mineração dentro de segundos ou milissegundos até mesmo umas das outras. Porque cada nó adiciona seu novo bloco no final de que ele vê como a cadeia mais longa antes da transmissão desse bloco à rede, será exibida uma bifurcação (branch) na árvore de bloco. Dependendo de onde se encontram esses nós e a largura de banda de nós conectados na rede e outras considerações de latência, uma fração da rede primeiro verá um bloco de como o novo bloco e adicionará que até o final da cadeia. Fração da rede verá o bloco B como o novo bloco e adicionará que até o final da cadeia. Isso deixa alguns nós com um bloco de e para outras pessoas com bloco B como o bloco de terminação (consulte Figura 3).

(Superior) Uma árvore de bloco que mostra uma bifurcação de árvore de bloco e duas cadeias de comprimento igual (inferior); Uma árvore de bloco que mostra uma bifurcação de árvore de bloco e uma cadeia mais longa
Figura 3 árvore de bloco (superior) um mostrando uma bifurcação de árvore de bloco e duas cadeias de comprimento igual (inferior); Uma árvore de bloco que mostra uma bifurcação de árvore de bloco e uma cadeia mais longa

Quando uma bifurcação ocorre conforme mostrado na parte superior da Figura 3, duas cadeias são na árvore de bloco — elas são iguais em comprimento e ambos são válidos. O problema que isso apresenta é claro quando você considera que nós mineração procuram a cadeia mais longa antes de começar a mineração porque elas precisam de hash para o bloco de terminação da cadeia.

Se um miner mina C de bloco e estava trabalhando em uma cadeia de com êxito, ele adicionará o bloco C ao final da cadeia que tem um bloco de como seu bloco de terminação (consulte a árvore de bloco inferior na Figura 3). Depois que ele faz isso, ele transmite o bloco C à rede e outros nós verá que A da cadeia é a cadeia mais longa. Nós de trabalho na cadeia B verá que cadeia um é maior que a cadeia de B e deixará de mineração para bloquear o seu atual para que eles podem começar a explorar um novo bloco que estende o bloco de C na cadeia de r. Assim que isso acontece, a rede libera todas as transações no bloco de B para o pool de transação, de modo que eles podem ser selecionados em uma nova rodada de mineração.

Você deve estar imaginando o que acontece com o Bitcoin acumulado por de mineração que criou b bloco: Suas comissões de transação e bloco recompensas nunca são emitidas. Na rede Bitcoin, essas recompensas não são dado a um minerador de até 100 blocos foram extraídos com êxito na parte superior do bloco em questão.

Neste artigo, explorei mais detalhadamente alguns dos tópicos introduzidos no meu artigo anterior. Juntos, os dois artigos abordam a maioria dos conceitos fundamentais que você realmente deve compreender para entender como blockchains funcionam. Depois de ler os dois, você deve compreender a arquitetura de rede distribuído, descentralizado do blockchain; Hash SHA-256; Noções básicas PKC e ECDSA; como nós construir transações em cadeias de hash e como digital assinaturas autorizam a transferência de propriedade do ativo digital; como as transações no pool de transação await seleção e verificação antes da introdução confirmado em um bloco; como nós especializado empregam um algoritmo de consenso específico (por exemplo, "mineradores" usando uma prova de trabalho ou usando uma prova do jogo "forgers") para gerar um bloco; e como adicionam nós na rede gerado blocos para a cadeia mais longa. Se você quiser aprofundar-se na blockchains, é altamente recomendável a manuais e os vídeos disponíveis em Manuais Online do Safari (safaribooksonline.com) e aquelas publicado pela Andreas Antonopoulos (antonopoulos.com).


Jonathan Waldmané engenheiro de software Microsoft Certified Professional, um arquiteto de soluções com a exposição técnico profundo em uma variedade de indústrias e especialista em ergonomia de software. Waldman é membro da equipe técnica da Pluralsight e atualmente lidera projetos de desenvolvimento de software setores institucional e privado. Ele pode ser contatado pelo jonathan.waldman@live.com e seguido no Twitter: @jwpulse.

Agradecemos ao seguinte especialista técnico da Microsoft pela revisão deste artigo: James McCaffrey


Discuta esse artigo no fórum do MSDN Magazine