1. Introdução
Os serviços de lances e leilões (B&A) são compostos por quatro serviços para compradores e vendedores facilitarem um leilão de público-alvo protegido:
Stack do comprador:
- Serviço de front-end do comprador
- Serviço de lances
Pilha do vendedor:
- Serviço de front-end do vendedor
- Serviço de leilão
Este codelab mostra como configurar e testar a configuração completa no seu ambiente local. O tutorial leva aproximadamente uma hora, excluindo o tempo inicial de criação do serviço.
Mesmo que você trabalhe apenas no código do comprador ou do vendedor, é útil configurar o fluxo completo no seu ambiente local para entender melhor como as pilhas do comprador e do vendedor funcionam uma com a outra. Ao configurar as duas pilhas, você pode ter mais confiança ao integrar com a pilha de comprador ou vendedor de outra parte. Testar os serviços localmente também economiza custos de desenvolvimento.
Neste codelab, vamos usar o app de testes locais do B&A como um complemento para o tutorial.
O app de testes locais complementar hospeda vários recursos de compradores e vendedores usados em um leilão de B&A. O app também oferece uma interface em http://localhost:3000
, onde é possível simular várias configurações de leilão.
2. Configuração do ambiente
2.1 Preparar uma máquina Linux
Use uma máquina local do Linux ou provisione uma VM do Linux do provedor de nuvem de sua preferência. Para melhorar o tempo de build, recomendamos pelo menos 16 núcleos e preferimos 32 ou mais.
Vamos carregar uma página HTML de http://localhost:3000
desta máquina. Se a VM não oferecer uma GUI, verifique se a porta 3000
está acessível para a máquina local para que você possa se conectar a ela.
2.2 Instalar o Docker
Usamos o Docker para executar os serviços e o aplicativo de teste local.
Vamos usar o script de conveniência para instalar o Docker em um ambiente de teste.
# Install Docker
> curl -fsSL https://get.docker.com -o get-docker.sh
> sudo sh get-docker.sh
# Set up sudo-less Docker
> sudo groupadd docker
> sudo usermod -aG docker $USER
> newgrp docker
# Test
> docker run hello-world
Aviso: com a configuração sem sudo, o grupo do Docker concede privilégios de nível raiz ao usuário. Leia o guia do Docker sem sudo para saber mais.
2.3 Iniciar o app complementar de testes locais
O app complementar oferece recursos, como scripts de lances/pontuações simulados e endpoints simulados de BYOS de K/V. O app precisa ser iniciado antes da execução dos serviços de B&A para que os recursos possam ser carregados nos serviços.
Role para baixo o repositório do app de teste local:
git clone https://github.com/privacysandbox/bidding-auction-local-testing-app.git
Na raiz do repositório, execute o script de configuração:
./setup
O script de configuração vai criar a rede Docker ba-dev
, gerar certificados SSL e criar a imagem do app de teste.
Depois que o build for concluído, execute o script de início:
./start
3. Criar e executar testes de usabilidade localmente
3.1 Puxar para baixo os serviços de B&A
Vamos executar dois conjuntos de serviços de B&A na mesma máquina, então vamos extrair o repositório em duas pastas diferentes.
Conjunto A:
Faça o download do repositório de perguntas e respostas:
git clone https://github.com/privacysandbox/bidding-auction-servers.git bidding-auction-servers-set-a
Conjunto B
Faça o download do repositório de perguntas e respostas:
git clone https://github.com/privacysandbox/bidding-auction-servers.git bidding-auction-servers-set-b
`
3.2 Criar os serviços
Na pasta raiz de cada pasta de B&A, execute o comando abaixo para criar os quatro serviços:
production/packaging/build_and_test_all_in_docker \
--service-path bidding_service \
--service-path auction_service \
--service-path buyer_frontend_service \
--service-path seller_frontend_service \
--platform gcp \
--instance local \
--no-precommit \
--no-tests \
--build-flavor non_prod \
--gcp-skip-image-upload
O comando acima vai criar uma instância local
do build de desenvolvimento (non_prod
) para o Google Cloud Platform (gcp
) de todos os quatro serviços. Atualize a flag --platform
para o provedor de nuvem de sua escolha, se necessário. Para saber mais sobre as flags de build, consulte o arquivo build_and_test_all_docker
.
O build inicial pode levar 2 horas se você estiver usando uma máquina de 64 núcleos, e o tempo de build varia linearmente de acordo com a contagem de núcleos. Se você estiver usando uma máquina de 32 núcleos, o processo pode levar 4 horas. Se você estiver usando uma máquina de 16 núcleos, o processo pode levar 8 horas.
Os builds subsequentes usam o cache, e cada um deles leva de 5 a 20 minutos.
Conheci Randall Munroe, do xkcd, enquanto escrevia este codelab e contei a ele que adicionei esta tirinha aqui.
3.3 Executar os serviços
Para nossos testes, vamos executar oito serviços (quatro por pilha). Cada comando é configurado para usar os recursos fornecidos pelo app de teste local. É altamente recomendável usar um gerenciador de janelas, como tmux
.
Abra pelo menos oito janelas de terminal adicionais e execute os comandos a seguir em cada sessão.
O servidor do app de teste local já precisa estar em execução em um processo separado, já que os scripts de lances e pontuação serão veiculados pelo app.
3.3.1 Comandos do conjunto A
Serviço | Comando |
Serviço de lances |
|
|
|
|
|
|
|
3.3.2 Comandos do conjunto B
Serviço | Comando |
Serviço de lances |
|
|
|
|
|
|
|
3.3.2 Variáveis de ambiente para os scripts de início locais
As variáveis de ambiente a seguir podem ser usadas para controlar o comportamento de inicialização.
Variável de ambiente | Disponibilidade | Descrição |
| Todos os serviços | Flags a serem definidas para o comando docker |
| Todos os serviços | Ao testar na máquina local, talvez seja necessário usar um certificado autoassinado que falha na verificação de pares SSL do O valor padrão é |
| Todos os serviços | O nível dos registros de serviço. Níveis mais altos fornecem mais registros. 0 é o menor e 10 é o maior. O valor padrão é |
| Serviço de lances | Porta do serviço de lances. O valor padrão é |
| Serviço de lances | URL da lógica de lances |
| Serviço de lances | Saída de dados para treinamento de modelos |
| Serviço de lances | Argumentos para inferência de lances |
| Serviço BFE | Porta do serviço BFE. O valor padrão é |
| Serviço BFE | Endereço K/V BYOS do comprador |
| Serviço BFE | Endereço K/V TEE do comprador |
| Serviço BFE | Endereço do serviço de lances do comprador |
| Serviço de leilão | Porta do serviço de leilão. O valor padrão é |
| Serviço de leilão | URL da lógica de pontuação |
| Serviço de leilão | URL do relatório de vitória do comprador |
| Serviço de leilão | Script do relatório de vitória do comprador |
| Serviço de leilão | Script de relatório de vitória do comprador para PAS |
| Serviço SFE | Porta do serviço SFE. O valor padrão é |
| Serviço SFE | Endereço do serviço de leilão do vendedor |
| Serviço SFE | Endereço de K/V BYOS do vendedor |
| Serviço SFE | Endereço de K/V do TEE do vendedor |
| Serviço SFE | Origem do vendedor |
| Serviço SFE | Endereços BFE do comprador |
4. Testar com o Secure Invoke na linha de comando
4.1 Testes de SFE
Também é possível usar a ferramenta Secure Invoke, incluída no pacote de serviços de B&A, para chamar os serviços diretamente da linha de comando.
4.1.2 Payload SelectAd
do SFE
A seguinte solicitação JSON foi preenchida com a configuração de leilão de B&A de vendedor único do SSP-BA
:
{
"auction_config": {
"seller": "https://localhost:6002",
"auction_signals": "{\"testKey\":\"someValue\"}",
"seller_signals": "{\"testKey\":\"someValue\"}",
"buyer_list": [
"https://localhost:5003",
"https://localhost:5004"
],
"per_buyer_config": {
"https://localhost:5003": { "buyer_signals": "{\"testKey\":\"someValue\"}" },
"https://localhost:5004": { "buyer_signals": "{\"testKey\":\"someValue\"}" }
}
},
"raw_protected_audience_input": {
"publisher_name": "http://localhost:4001",
"generation_id": "1210718540",
"enable_debug_reporting": true,
"raw_buyer_input": {
"https://localhost:5003": {
"interest_groups": [
{
"name": "dsp-x-demo",
"ad_render_ids": ["1234"],
"bidding_signals_keys": ["demo-key"],
"browser_signals": { "bid_count": "1", "join_count": "1", "prev_wins": "[]" },
"user_bidding_signals": "[1, 2, 3]"
}
]
},
"https://localhost:5004": {
"interest_groups": [
{
"name": "dsp-x-demo",
"ad_render_ids": ["1234"],
"bidding_signals_keys": ["demo-key"],
"browser_signals": { "bid_count": "1", "join_count": "1", "prev_wins": "[]" },
"user_bidding_signals": "[1, 2, 3]"
}
]
}
}
}
}
Salve o arquivo como sfe-test.json
na pasta raiz do repositório de serviços do Set A. O script de build do B&A vai copiar os arquivos na pasta raiz do repositório para a pasta /src/workspace
da imagem do Docker.
4.1.2 Chamar a SFE com o Secure Invoke
Execute o seguinte comando na pasta raiz do repositório de serviços de B&A:
DOCKER_NETWORK=ba-dev ./builders/tools/bazel-debian run //tools/secure_invoke:invoke \
-- \
-target_service=sfe \
-input_file=/src/workspace/sfe-test.json \
-host_addr=192.168.84.104:50053 \
-client_ip=192.168.84.100 \
-insecure=true
Se as pilhas de B&A estiverem configuradas corretamente, você vai receber a seguinte resposta de sucesso:
{"adRenderUrl":"https://localhost:5004/ad.html","interestGroupName":"dsp-x-demo","interestGroupOwner":"https://localhost:5004","score":39,"bid":39,"biddingGroups":{"https://localhost:5003":{"index":[0]},"https://localhost:5004":{"index":[0]}}}
4.2 Teste de BFE
4.2.1 Solicitação de GetBids
do BFE
{
"buyer_input": {
"interest_groups": {
"name": "dsp-x-demo",
"ad_render_ids": ["1234"],
"bidding_signals_keys": ["demo-key"],
"browser_signals": { "bid_count": "1", "join_count": "1", "prev_wins": "[]" }
}
},
"auction_signals": "{\"testKey\":\"someValue\"}",
"buyer_signals": "{\"testKey\":\"someValue\"}",
"seller": "https://localhost:6002",
"publisher_name": "http://localhost:4001",
"enable_debug_reporting": true,
"client_type": "CLIENT_TYPE_BROWSER"
}
Salve o arquivo como bfe-test.json
na pasta raiz do repositório de serviços de B&A.
4.2.2 Chamar BFE com o Secure Invoke
Execute o seguinte comando na pasta raiz do repositório de serviços de B&A:
DOCKER_NETWORK=ba-dev ./builders/tools/bazel-debian run //tools/secure_invoke:invoke \
-- \
-target_service=bfe \
-input_file="/src/workspace/bfe-test.json" \
-host_addr="192.168.84.102:50051" \
-client_ip=192.168.84.100 \
-insecure=true
Se as pilhas de B&A estiverem configuradas corretamente, o BFE vai retornar a seguinte resposta:
{"bids":[{"bid":6,"render":"https://localhost:5003/ad.html","interestGroupName":"dsp-x-demo"}],"updateInterestGroupList":{}}
4.3 Verificar os registros do SFE
Acesse o terminal e verifique os registros do SFE. Vamos analisar alguns dos registros importantes na saída.
4.3.1 Payload criptografado da solicitação SelectAd
Nesta saída de registro do SFE, encontramos o payload criptografado da chamada navigator.getInterestGroupAdAuctionData()
. Esse payload é gerado pelo navegador, enviado da tag para o SAS e, em seguida, encaminhado para a SFE:
I1210 21:20:47.266673 37 select_ad_reactor.cc:228] Protected auction ciphertext: AEAAIAABAAKg3OQSSLEBMR1MmJiwfOT8uef41iE+DQIvKUowsQvVcGbWZ+r17ff2r/iTbEnwqLPtpAxSTy77mi+cVV5cKjkKb4piaZnKiCDIMCyEvrQUD4+BG+HgrbUFhqiWPmQhNThvInMaHuYrXG7xushbRtvSPsVzEl6iBZcLZzD7W3CHMFK7bnJ+ufu52W6B7/8dOQ1gZW6SpwXMGNcrurTGoucbwbZRIPqCcbZk76J1gB69wrDYRo1wQ6jmBleLM36nulxbEj/sHhpQIgr895aKqEGQ3Fy+/HHPTO+zHphcX44YeF6mZ/I+WxZTDxCi1x27nI4yvzC8vI4a/giJN5XUlJZGb/fMrj3/Qly+gwJ8lbxdX+4GWTooDoS4MTtiBpJqh9wkIQ5XwfO54p8Kv6j/tk+51hOfVkOdtGwX0LvVrWT9PiJOJHa23nZ1fLg/22mTe05xdbR3WVeA+xiO9YwF4ozyCYDRUkDyWB/3k9RuaaT9H5S1szVpuOuD2nYSRpT9svmpfG4kipiS6BTPZPX2whDlukpuuoFgdiDtH6cFShNhZ5C47R0ayAvaZ1QSpOZMWfA6pdl4nhvNLpOKesKY/KFDEBzpUXRDsQWsfvmdqFl1mCeX9rOrEc9rodYVLXXhM8GPycehHmvqkccTBW6kipOQlmnSdIYaFmtWSFpUrzxajGkct3mZdTjVjOf...
4.3.2 Payload descriptografado
Nesta saída, encontramos o payload descriptografado da chamada navigator.getInterestGroupAdAuctionData()
:
I1210 21:20:47.267590 37 select_ad_reactor.cc:347] (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) Decoded BuyerInput:
https://localhost:5003 : {interest_groups { name: "dsp-x-demo" bidding_signals_keys: "demo-key" browser_signals { join_count: 1 recency: 7 prev_wins: "[]" } }}
4.3.3 Solicitação de GetBids
para o BFE
A solicitação GetBids
é enviada da SFE para a BFE:
I1210 21:20:47.267710 37 select_ad_reactor.cc:751] (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) Getting bid from a BFE
I1210 21:20:47.267729 37 buyer_frontend_async_client.cc:52] Raw request:
buyer_input {
interest_groups {
name: "dsp-x-demo"
bidding_signals_keys: "demo-key"
browser_signals {
join_count: 1
recency: 7
prev_wins: "[]"
}
}
}
auction_signals: "{\"testKey\":\"someValue\"}"
buyer_signals: "{\"testKey\": \"someValue\"}"
seller: "https://localhost:6002"
publisher_name: "localhost"
enable_debug_reporting: true
log_context {
generation_id: "c2824bfc-d515-4a1a-9de9-7660ad963252"
}
client_type: CLIENT_TYPE_BROWSER
4.3.4 Resposta GetBids
do BFE
O BFE responde com o lance:
I1210 21:20:47.282549 41 select_ad_reactor.cc:856] (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) Received response from a BFE ...
I1210 21:20:47.282552 41 select_ad_reactor.cc:859] (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252)
GetBidsResponse:
bids {
bid: 9
render: "https://localhost:5003/ad.html"
interest_group_name: "dsp-x-demo"
}
update_interest_group_list {
}
4.3.5 Solicitação ScoreAds
para o serviço de leilão
Depois que os lances são recebidos, a chamada ScoreAds
é feita pelo SFE para o serviço de leilão para cada lance:
I1210 21:20:47.287898 18 select_ad_reactor.cc:1280] (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) ScoreAdsRawRequest:
ad_bids {
bid: 9
render: "https://localhost:5003/ad.html"
interest_group_name: "dsp-x-demo"
interest_group_owner: "https://localhost:5003"
join_count: 1
k_anon_status: true
}
seller_signals: "{\"testKey\":\"someValue\"}"
auction_signals: "{\"testKey\":\"someValue\"}"
scoring_signals: "{\"renderUrls\":{\"https://localhost:5003/ad.html\":[1,2,3],\"https://localhost:5004/ad.html\":[1,2,3]}}"
publisher_hostname: "localhost"
enable_debug_reporting: true
log_context {
generation_id: "c2824bfc-d515-4a1a-9de9-7660ad963252"
}
per_buyer_signals {
key: "https://localhost:5003"
value: "{\"testKey\": \"someValue\"}"
}
per_buyer_signals {
key: "https://localhost:5004"
value: "{\"testKey\": \"someValue\"}"
}
seller: "https://localhost:6002"
4.3.6 Resposta ScoreAds
do serviço de leilão
O serviço de leilão do vendedor responde com a pontuação de atratividade:
I1210 21:20:47.298029 33 default_async_grpc_client.h:134] Decrypting the response ...
I1210 21:20:47.298100 33 default_async_grpc_client.h:152] Decryption/decoding of response succeeded: ad_score {
desirability: 9
render: "https://localhost:5003/ad.html"
interest_group_name: "dsp-x-demo"
buyer_bid: 9
interest_group_owner: "https://localhost:5003"
win_reporting_urls {
top_level_seller_reporting_urls {
}
}
ad_type: AD_TYPE_PROTECTED_AUDIENCE_AD
}
4.3.7 Resposta SelectAd
da SFE
A resposta SelectAd
do SFE é criptografada e enviada ao SAS:
I1210 21:20:47.298428 33 select_ad_reactor.cc:1413] (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) Encrypted SelectAdResponse:
auction_result_ciphertext: "\023\233\252\321\000\331M\327\216\201S\332kl?\322\255\247\312\375h\007W\367\016\366FR\364\275\377\326\027h\204\203\265\t\271-\333\266\tH\342\033F\001k\211C\026V\013\271\255(\236\273\353\260\275\007\346\027\340?\005|\235S\244\265\2563U\246\322\177%\200/\3175\034 \020\024\362\345\3263\356F.s\261\005\231\262Z\000\330x\0230\335>\"\217\254\010\254\330>\206\007\274\235\037`\370W\032\207\356\367\206\026\341.i\"$\370\367\2554i\247\354\304e\306\2466S\337\321w\327+!\316\035:\002\231\246\362\366qm\211\000\013\343\345\224{\365py\361\374\316\202\217-\244\302\331\216D\025W#.\304nH\235\315\311<#\342\344\324\257\354\2441\251\312\320\226\342\021\377>3`\347/\350\254h\306\273\023\365\340@\321\2412\254\323\213\0137,\013n\220|\211\323/\030)\314\263\223\355>\254\312aa`!\375\335\023Z\234p\206\037\001\355\261{$\025+\341\275\327Ny\342\342\264=\376\2138\224\026\2058\251\020\202\245*46\023\307)K\342\364k<\2104r\247\034\216}\034\001\374\215\363\210\026\275\371S>\031;f.b\260\363\257.\255\023I\341A\237*_T\355\262\005\344L\336D%\327\267@\302$\300\340\203c\350|\337>C\275c\260\202o\315xp\260\257\241\305U\nK\033\274L6\025\350\373a:\253\212&>p\210\215\017&^\327\005_\037\020\212\362\351\341\231@g\372\0037\275b:)\207\303d\243?\261O\266\343\214\200\004\247\372\022S\326\200\037\330\252r\257+e\273[\231\202\3625{\330\213\240\370\245\\\214\350/\313\ty/\004\313\0304k\223\354\374\305\233\264\224K\344\241\251\322?\323q6\314D\027\200\203\035]\023O\306\230?\203\237:\254\305\265\332\330\2641l\322\020\022\330O-\242\207>Q\364_{F\235\353tk\207\035\205\005\221\373\207\0143\035\014\322\240H\220\347%\262f\347\017\352\273\265\231\014\204\r\312\254z\000\340&\354\222\323\245\356\217(i\246"
5. Testar com o app de teste local no navegador
5.1 Abra o Chrome
Leia o artigo do Chromium sobre como iniciar o Chrome pela linha de comando e inicie-o com as seguintes flags:
google-chrome --enable-privacy-sandbox-ads-apis --disable-features=EnforcePrivacySandboxAttestations,FledgeEnforceKAnonymity --enable-features=FledgeBiddingAndAuctionServerAPI,FledgeBiddingAndAuctionServer:FledgeBiddingAndAuctionKeyURL/https%3A%2F%2Fstorage.googleapis.com%2Fba-test-buyer%2Fcoordinator-test-key.json
A flag está definida para carregar a chave de coordenador simulado que hospedamos em https://storage.googleapis.com/ba-test-buyer/coordinator-test-key.json
Importante: saia completamente de todas as instâncias do Chrome antes de abri-lo na linha de comando com as flags B&A. Para sair de todos os processos do Chrome, tente executar ps aux | grep -ie chrome/chrome | awk '{print $2}' | xargs kill -9
na linha de comando.
5.2 Acessar a interface do app de teste local
A interface do app pode ser encontrada em http://localhost:3000 na instância do navegador Chrome aberta com as flags. O endereço exato que você visita pode ser diferente se você estiver usando uma VM com um nome de host diferente.
Na linha de cima do app, o painel "Controls" contém os botões para simular diferentes configurações de leilão. Os outros dois painéis contêm iframes dos sites do anunciante e do editor.
Quando você clica no botão "Carregar tags de DSP" no iframe da página do anunciante, um script de cada DSP é adicionado à página. Esses scripts adicionam o usuário a grupos de interesse. Abra o Chrome DevTools e acesse "Application / Storage / Interest Groups" para examinar os grupos de interesse unidos pelas tags do DSP:
Em seguida, clique nos botões no painel "Controles" para simular vários tipos de leilão.
Se os serviços de B&A e o app de testes locais estiverem configurados corretamente, o anúncio anterior será renderizado no painel "Iframe do site do editor".
5.3 Configuração do leilão do app de teste local
No app de teste local complementar, os seguintes participantes são hospedados, diferenciados pelo número da porta (uma porta diferente é considerada de origem cruzada):
Participante | Descrição | Porta |
Advertiser | Carrega tags de DSP na página |
|
Editor | Carrega tags do SSP na página |
|
| Comprador no dispositivo |
|
| Comprador no dispositivo |
|
| Comprador de B&A |
|
| Comprador de B&A |
|
| Vendedor de nível superior |
|
| Vendedor somente no dispositivo |
|
| Vendedor somente do B&A |
|
| Vendedor de modo misto |
|
Há quatro DSPs:
DSP-A
eDSP-B
participam de leilões no dispositivoDSP-X
eDSP-Y
participam de leilões de B&A
Há quatro SSPs, e cada vendedor executa uma configuração de leilão diferente:
SSP-OD
faz um leilão somente no dispositivoSSP-BA
faz um leilão somente para B&ASSP-MIX
faz um leilão no modo mistoSSP-TOP
faz um leilão de vários vendedoresSSP-OD/BA/MIX
participa como vendedor de componentes do leilão de vários vendedores deSSP-TOP
Para conferir a arquitetura completa, consulte o diagrama de design.
5.4 Configuração de lances e serviços de leilão
Neste codelab, executamos dois conjuntos de perguntas e respostas.
Definir | Serviço | Participante | Endereço de rede |
Conjunto A | Serviço de lances |
|
|
Serviço BFE |
|
| |
Serviço de leilão |
|
| |
Serviço SFE |
|
| |
Conjunto B | Serviço de lances |
|
|
Serviço BFE |
|
| |
Serviço de leilão |
|
| |
Serviço SFE |
|
| |
App | App de teste local | Todos |
|
- No conjunto A, os serviços do comprador são usados por
DSP-X
e os serviços do vendedor são usados porSSP-BA
- No conjunto B, os serviços do comprador são usados por
DSP-Y
e os serviços do vendedor são usados porSSP-MIX
Para a comunicação entre o app de teste local e os serviços de B&A, é usada uma rede de ponte do Docker. A rede de ponte ba-dev
é criada pelo script de configuração do app de teste local. Um endereço IP é atribuído aos serviços de B&A na sub-rede de 192.168.84.0
.
Por exemplo, quando você chama o SFE do Set A no aplicativo, o endereço de rede de 192.168.84.104:50053
é usado. Quando você carrega o script de lances simulados do DSP-X para o BFE, o https://192.168.84.100:5003/generate-bid.js
é usado.
6. Conclusão
Esperamos que você já tenha se familiarizado com a execução da pilha de serviços de B&A localmente na sua máquina e entendido melhor como os serviços se comunicam entre si.
6.1. Suporte técnico
- Se você tiver dúvidas sobre a configuração do app de teste local, abra um problema no repositório do LTA.
- Se você tiver dúvidas sobre os serviços de lances e leilões, abra um problema no repositório de serviços de lances e leilões.
- Se você tiver dúvidas sobre o Sandbox de privacidade em geral, abra um problema no repositório privacy-sandbox-dev-support.
6.2 Saiba mais
- Saiba mais sobre a arquitetura de B&A para a Web
- Saiba mais sobre a integração do vendedor com o B&A para Web