To je januar 1997. Naši (Internet Engineering Task Force) has just released Službeno definiše Specifikaciju su napisali web pioniri U pitanju je U pitanju je U pitanju je i , arhitekti koji su oblikovali kako internet komunicira. IETF Uslovi korišćenja RFC 2068 HTTP/1.1 Roy Fielding Džim Getiš Džefri Mogul HENRIK FRIJSTJAK Tim Berners-Lee je IETF Uslovi korišćenja RFC 2068 Roy Fielding Džim Getiš Džefri Mogul HENRIK FRIJSTJAK Tim Berners-Lee je Specifikacija uvodi : ranije, svaki pojedini HTTP zahtjev zahtijevao je novu TCP vezu. Trajne veze to rješavaju, omogućujući višestrukim HTTP zahtjevima da teče kroz jednu, dugotrajnu TCP vezu. Nema više uspostavljanja zasebnih veza za svaku sliku, CSS fajl ili JavaScript snippet na web stranici. persistent connections Tu je i , novi način za web servere za streaming sadržaja bez poznavanja punu veličinu unaprijed. više ne treba da server izračunati ukupnu veličinu dinamički generisanog sadržaja unaprijed, to je sada slobodno da dostavi podatke postepeno, kao što je proizvedeno. chunked transfer encoding Ipak Novi statusni kod: RFC 2068 quietly introduces something intriguing HTTP 402 Payment Required This code is reserved for future use. Ovo pokazuje kako su osnivači World Wide Web predvidjeli kako će novac na kraju postati veliki deo Interneta. . even if they had no clear path on how it would actually play out Danas, 2025, gotovo tri decenije i više verzija HTTP-a kasnije ( in 2015, U 2022. godini Unatoč fintech revoluciji, porastu online plaćanja i čitavoj ekonomiji zasnovanoj na internetskim transakcijama, nitko nije shvatio šta da radi s tim. HTTP/2 HTTP/3 Status Code 402 still sits there with the exact same note: 'reserved for future use.' Until now. Prošlog meseca (maj 2025) oslobođenje , otvorenog koda protokol koji daje Njegov prvi pravi posao: omogućavanje domorodaca plaćanja unutar HTTP zahteva. Korišćenje x402 HTTP 402 onchain U današnje vrijeme agencije moraju (mašina-na-mašina) plaćanja preko interneta sa smanjenim (ljudi u krugu) intervencije, ali tradicionalni tokovi plaćanja ne rade dobro u ovom slučaju. Oni zahtijevaju višestruke ljudske interakcije, preusmjeravanja i ručne korake koji jednostavno ne rade kada AI agent treba da izvrši transakciju autonomno. M2M HITL On predlaže automatizovani tok plaćanja na lancu koji se implementira nativno unutar HTTP protokola, . x402 making them as seamless as any other web request Ali kako to izgleda u praksi? Arhitektura i komponente Uslovi korišćenja Uslovi korišćenja Izgrađen je oko četiri osnovne komponente: x402 Korišćenje A djeluje kao inicijator plaćanja, otkrivajući što je potrebno za pristup i izgradnju odgovarajućeg korisnog opterećenja plaćanja. Jednostavno rečeno, to je sve što HTTP zahtjev pretvara u platni zidni resurs. To može biti pretraživač koji podnosi zahtjev za premium sadržaj, AI agent koji kupuje API pristup ili mobilnu aplikaciju koja otključava funkcije. Klijenat rješava kriptografsko potpisivanje koristeći korisnikov privatni ključ i automatski vraća zahteve kada je plaćanje potrebno. client Naši primjenjuje politike plaćanja za svoje krajnje točke, dok ostaje fokusiran na svoju osnovnu poslovnu logiku. Ovo je web server ili API koji hostuje sadržaj ili uslugu koja se kupuje. Ona održava jednostavne tabele cijena koje mapiraju krajnje točke na troškove, ali delegira logiku verifikacije plaćanja facilitatoru. resource server Blockchain logika se primjenjuje u komponenta: verifikacija kriptografskih potpisa, sprečavanje napada ponovnog igranja putem nonce praćenja i upravljanje stvarnim raspodjelom na lancu. Omogućuje i klijentima i serverima da rade s plaćanjima na lancu bez razumijevanja detalja implementacije blokčeina. facilitator On je nalazi se u konačnom sloju poravnanja, osiguravajući da su plaćanja nepromjenjiva i transparentna. Omogućava programabilni novac kroz pametne ugovore i stabilne kovanice, . blockchain but its complexity is completely hidden from the application layer by the facilitator : Client Osnovna odgovornost: inicijativa plaćanja Ključne karakteristike:EIP-712 potpisivanje, automatski povratak, otkrivanje plaćanja Šta radi: postavlja zahteve, rješava novčanike, vraća se s plaćanjem : Resource Server Primarna odgovornost: izvršenje plaćanja Ključne karakteristike: tabele cijena, HTTP 402 odgovori, integracija srednjeg softvera Šta radi: postavlja cijene, provjerava plaćanja, služi sadržaju : Facilitator Ključna reč: provjera plaćanja Ključne karakteristike: Verifikacija potpisa, nonce tracking, abstrakcija plina Šta radi: Proverava potpise, razgovara s blokčeinom : Blockchain Osnovna odgovornost: plaćanje Ključne karakteristike:USDC transferovi, pametni ugovori, nepromjenjivi zapisi Šta radi: Rješava plaćanja na lancu Načela Ova arhitektura pokazuje nekoliko osnovnih načela softverskog inženjeringa. Svaka komponenta ima jedinstvenu, dobro definiranu odgovornost. . separation of concerns Resource servers focus purely on business logic, facilitators handle payment complexity, and clients manage user interaction Sistem postiže tako što komponente interakcije samo kroz standardizovane HTTP i REST sučelja. Ova izolacija znači da možete zamijeniti komponente (na primjer, koristiti drugačiji blokčein, promijeniti pružatelje olakšica ili modificirati logiku servera) bez utjecaja na ostatak sistema. loose coupling A resource server doesn't need to understand how blockchain transactions work, and a client doesn't need to know the server's internal implementation The facilitator embodies the time što izolira svu složenost blokčeina u jednu specijaliziranu uslugu.To sprečava da se logika plaćanja curila u poslovne aplikacije i drži brige pravilno odvojene. single responsibility principle Posljednje, ali ne i najmanje važno, ova arhitektura slijedi: Komponente visokog nivoa ovise o abstrakcijama, a ne konkretnim implementacijama. Serveri i klijenti ovise o HTTP sučeljima, a ne specifičnim blockchain API-jima. dependency inversion Plaćanje tokovima Kada korisnik ili korisnik uđe u -omogućeno API, evo četiri koraka toka koji se događa: x402 Inicijalni zahtev: Klijent postavlja standardni HTTP zahtev za pristup određenom resursu Odgovor koji zahtijeva plaćanje: Ako nije priloženo plaćanje, server odgovara HTTP 402 i uključuje detalje o plaćanju Autorizacija plaćanja: Klijent stvara kriptografski potpisano plaćanje i ponavlja zahtjev Verifikacija i pristup: Server potvrđuje plaćanje, emituje ga na blokčein i odobrava pristup Ono što to čini moćnim je to što se sve događa na razini HTTP protokola. Nema preusmjeravanja na treće strane procesore plaćanja, ne tokovi, bez stvaranja računa. OAuth Just standard HTTP with extra headers: X-PAYMENT teče od klijenta do servera i sadrži potpisani payload plaćanja. Ovo uključuje podatke o plaćanju (broj, primatelj, token) plus kriptografski potpis koji dokazuje da je klijenat ovlastio plaćanje. X-PAYMENT-RESPONSE teče od servera do klijenta nakon uspješnog plaćanja i sadrži informacije o prijemu transakcije, pružajući transparentnost o tome šta se dogodilo na lancu. Korišćenje Server-side implementacija Plaćanje middleware arhitektura Jedinstvena implementacija na strani servera okružuje se filterom za plaćanje (AKA middleware) koji presreće HTTP zahteve i izvršava zahteve za plaćanje. Kada je integrisan u vaš web server, ovaj middleware provjerava dolazne zahteve u odnosu na tablicu cijena koja mapira krajnje točke prema njihovim troškovima. Srednja roba slijedi jednostavno drvo odluka: ako zahtjev udari u zaštićenu krajnju tačku bez plaćanja, on odgovara sa i detaljne upute za plaćanje. Ako je plaćanje uključeno u na glavi, on provjerava plaćanje sa uslugom facilitatora pre nego što dozvoli da se zahtev nastavi. HTTP 402 X-PAYMENT Ovo je osnovna struktura iz implementacije Java: public class PaymentFilter implements Filter { private final String payTo; private final Map<String, BigInteger> priceTable; // path → amount private final FacilitatorClient facilitator; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String path = req.getRequestURI(); String paymentHeader = req.getHeader("X-PAYMENT"); if (!priceTable.containsKey(path)) { chain.doFilter(request, response); // Free endpoint return; } if (paymentHeader == null) { send402Response(resp, path); // Request payment return; } // Verify payment, process request, then settle VerificationResponse verification = facilitator.verify(paymentHeader, requirements); if (verification.valid) { chain.doFilter(request, response); facilitator.settle(paymentHeader, requirements); } } } Jednostavno dodajte filter za plaćanje u svoj stak srednjih proizvoda i odredite koje krajnje točke zahtijevaju plaćanje. The beauty of this approach is that it requires minimal changes to existing applications. Odgovor PaymentRequirements Kada klijent udari na zaštićenu krajnju točku bez plaćanja, server konstruira detaljan predmet zahtjeva za plaćanje.To uključuje iznos plaćanja, prihvaćene žetone (kao što su ), primajući adresu novčanika, blockchain mrežu i vrijeme isteka kako bi se spriječili napadi ponovnog igranja. USDC private void send402Response(HttpServletResponse response, String path) throws IOException { response.setStatus(HttpStatus.PAYMENT_REQUIRED); response.setContentType("application/json"); PaymentRequirements requirements = PaymentRequirements.builder() .paymentRequirement(List.of( PaymentRequirement.builder() .kind(new Kind("exact", "base-sepolia")) // Payment scheme + blockchain network .receiver(payTo) // Wallet address to receive payment .amount(priceTable.get(path)) // Cost for this specific endpoint .asset("<USDC_TOKEN_CONTRACT>") // USDC token contract .expiry(Instant.now().plus(Duration.ofMinutes(5))) // Payment window .nonce(UUID.randomUUID().toString()) // One-time use identifier .build() )) .build(); response.getWriter().write(Json.MAPPER.writeValueAsString(requirements)); } Svako polje u Opisuje se kako slijedi: PaymentRequirements tip: Definira shemu plaćanja (točno za fiksne iznose) i ciljnu mrežu blockchain (base-sepolia za Base testnet). primatelj: Adresa novčanika na koju treba poslati plaćanje. Ovo je vaš poslovni novčanik koji će primiti sredstva. iznos: Trošak pristupa ovoj specifičnoj krajnjoj točki, prikupljen iz tabele cijena. Za USDC, to se obično izražava u wei (najmanja jedinica). sredstvo: pametna ugovorna adresa žetona koji će se koristiti za plaćanje. Primjer prikazuje USDC na Base Sepolia testnet. istek: vremenski žig nakon kojeg ovaj zahtev za plaćanje postaje nevažeći.To sprečava ponovnu upotrebu starih zahteva za plaćanje i dodaje sigurnost protiv napada ponovnog igranja. nonce: Jedinstveni identifikator (UUID) koji osigurava svaki zahtev za plaćanje može biti ispunjen samo jednom, čak i ako isti klijent podnese više zahtjeva istoj krajnjoj točki. Implementacija od strane klijenta Automatsko plaćanje Knjižnice klijenata omotaju standardne HTTP klijente da automatski obrađuju 402 odgovore.Kada klijent primi zahtjev za plaćanje, (1) on konstruira korisno opterećenje za plaćanje, (2) on ga potpisuje korisnikovim privatnim ključem i (3) on ponavlja izvorni zahtev s priloženim plaćanjem. public HttpResponse<String> makeRequest(String url, String method) throws Exception { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .method(method, HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); // Handle 402 Payment Required if (response.statusCode() == 402) { PaymentRequirements requirements = Json.MAPPER.readValue( response.body(), PaymentRequirements.class); // Create payment payload matching the requirements PaymentPayload payment = PaymentPayload.builder() .receiver(requirements.getPaymentRequirement().get(0).getReceiver()) .amount(requirements.getPaymentRequirement().get(0).getAmount()) .asset(requirements.getPaymentRequirement().get(0).getAsset()) .nonce(requirements.getPaymentRequirement().get(0).getNonce()) .expiry(requirements.getPaymentRequirement().get(0).getExpiry()) .build(); // Sign using EIP-712 structured data signing String signature = signer.sign(payment.toSigningMap()); // Retry with payment header String paymentHeader = encodePaymentHeader(payment, signature); HttpRequest paidRequest = HttpRequest.newBuilder() .uri(URI.create(url)) .method(method, HttpRequest.BodyPublishers.noBody()) .header("X-PAYMENT", paymentHeader) .build(); return httpClient.send(paidRequest, HttpResponse.BodyHandlers.ofString()); } return response; } Proces potpisivanja koristi se standard, koji stvara strukturiranu, ljudski čitljivu reprezentaciju podataka o plaćanju prije hashinga i potpisivanja. EIP-712 Proveravanje toka plaćanja Facilitator integracije Usluga facilitatora je tamo gdje blokčein složenost živi, abstrahujući ga od klijenata i servera.Kada server prima plaćanje, on šalje korisno opterećenje plaćanja facilitatoru za verifikaciju. public class HttpFacilitatorClient implements FacilitatorClient { private final HttpClient http; private final String baseUrl; @Override public VerificationResponse verify(String paymentHeader, PaymentRequirements requirements) throws Exception { // Construct verification request with payment and requirements VerifyRequest body = VerifyRequest.builder() .paymentHeader(paymentHeader) // The X-PAYMENT header from client .requirements(requirements) // What the server expects .build(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(baseUrl + "/verify")) .POST(HttpRequest.BodyPublishers.ofString(Json.MAPPER.writeValueAsString(body))) .header("Content-Type", "application/json") .build(); String json = http.send(request, HttpResponse.BodyHandlers.ofString()).body(); return Json.MAPPER.readValue(json, VerificationResponse.class); } @Override public SettlementResponse settle(String paymentHeader, PaymentRequirements requirements) throws Exception { // Settlement happens after successful verification SettleRequest body = SettleRequest.builder() .paymentHeader(paymentHeader) .requirements(requirements) .build(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(baseUrl + "/settle")) .POST(HttpRequest.BodyPublishers.ofString(Json.MAPPER.writeValueAsString(body))) .header("Content-Type", "application/json") .build(); String json = http.send(request, HttpResponse.BodyHandlers.ofString()).body(); return Json.MAPPER.readValue(json, SettlementResponse.class); } } Facilitator provjerava nekoliko stvari: Je li potpis valjan? Da li iznos plaćanja odgovara zahtjevima? Da li je ova isplata korišćena ranije? Je li plaćanje još uvijek unutar svog prozora isteka? Ako provjera prođe, facilitator takođe rješava poravnanje emitiranjem transakcije na blokčein po izboru. Interfejs definira ugovor koji svaki facilitator klijent mora provesti: FacilitatorClient public interface FacilitatorClient { VerificationResponse verify(String paymentHeader, PaymentRequirements requirements); SettlementResponse settle(String paymentHeader, PaymentRequirements requirements); } Vaša aplikacija mora pružiti konkretnu implementaciju ovog sučelja. Primer integracije Sada kada smo videli pojedinačne komponente (filteri za plaćanje, integracija olakšica i rukovanje klijentima), pogledajmo kako se ti komadi uklapaju u pravu aplikaciju. Primjer koji pokazuje potpuni tok. Spring Boot Prvo, kreirajte a Upozorenja : @PaymentRequired @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface PaymentRequired { String price(); String currency() default "USDC"; String network() default "base-sepolia"; } Zatim promijenite za skeniranje za ove bilješke na startu: PaymentFilter @Component public class PaymentFilter implements Filter { private final Map<String, BigInteger> priceTable; private final String payTo; private final FacilitatorClient facilitator; public PaymentFilter(ApplicationContext context, String payTo, FacilitatorClient facilitator) { this.payTo = payTo; this.facilitator = facilitator; this.priceTable = buildPriceTableFromAnnotations(context); } private Map<String, BigInteger> buildPriceTableFromAnnotations(ApplicationContext context) { Map<String, BigInteger> prices = new HashMap<>(); // Scan all @RestController beans for @PaymentRequired annotations Map<String, Object> controllers = context.getBeansWithAnnotation(RestController.class); for (Object controller : controllers.values()) { Method[] methods = controller.getClass().getMethods(); for (Method method : methods) { PaymentRequired payment = method.getAnnotation(PaymentRequired.class); if (payment != null) { String path = extractPathFromMapping(method); BigInteger amount = new BigInteger(payment.price().replace(".", "")); prices.put(path, amount); } } } return prices; } } Sada možete direktno anotirati metode kontrolera: @RestController public class WeatherController { @GetMapping("/weather") @PaymentRequired(price = "0.001", currency = "USDC", network = "base-sepolia") public WeatherData getWeather(@RequestParam String city) { // Your existing business logic return weatherService.getWeatherForCity(city); } @GetMapping("/premium-forecast") @PaymentRequired(price = "0.01", currency = "USDC", network = "base-sepolia") public ExtendedForecast getPremiumForecast(@RequestParam String city) { return weatherService.getExtendedForecast(city); } } @Configuration public class PaymentConfig { @Bean public PaymentFilter paymentFilter(ApplicationContext context) { return new PaymentFilter( context, "<WALLET_ADDRESS>", // Your wallet address new HttpFacilitatorClient("<FACILITATOR_URL>") ); } @Bean public FilterRegistrationBean<PaymentFilter> paymentFilterRegistration(PaymentFilter filter) { FilterRegistrationBean<PaymentFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(filter); registration.addUrlPatterns("/*"); registration.setOrder(1); return registration; } } Naši anotacija rješava konfiguraciju cijena deklarativno, dok automatski otkriva ove bilješke na pokretanju i gradi tablicu cijena. Vaša postojeća poslovna logika u metodama kontrolera ostaje potpuno nepromijenjena. Konfiguracija sve povezuje tako što registruje filter za plaćanje i povezuje ga sa uslugom facilitatora. cijena 0.001 USDC i košta 0,01 USDC, sa svim obrađivanjem plaćanja koje se odvija transparentno na HTTP sloju. @PaymentRequired PaymentFilter /weather /premium-forecast Bezbednosni i proizvodni razmatranja is simple and elegant, it hides complexity. This is a pro and a con. It makes integration easy, but it also hides an important aspect: . x402 putting AI agents in charge of money creates new attack vectors dok signature i nonce management rukovati replay napade, što se događa kada je agent kompromitiran? Tradicionalno otkrivanje prijevare se oslanja na ljudske obrasce ponašanja, ali Kompromitovani agent mogao bi isprazniti novac brže od bilo kojeg ljudskog prevaranta. EIP-712 AI agents don't follow human spending habits Komponenta Facilitator postaje još jedna meta visoke vrednosti jer provjerava potpise i upravlja noncesima. . blockchain settlements are final od is based on on-chain transactions, it inherits the operational risks of blockchain transactions. Gas fees fluctuate wildly, sometimes making micropayments economically inconvenient. Network congestion can delay transactions. What's an AI agent supposed to do when it needs real-time data but the payment is stuck in a mempool? x402 Još jedan važan aspekt je regulacija. Usklađenost se razlikuje u različitim jurisdikcijama s različitim pravilima o automatizovanim plaćanjima, upotrebi kriptovaluta i zadržavanju podataka. Agenat AI koji obavlja veliki volumen mikro transakcija preko granica može pokrenuti AML alarme ili prekršiti lokalne propise, a da to nitko ne shvati. What's next Šta je zanimljivo o AI agenti trebaju autonomne mogućnosti plaćanja, stablecoins pružaju programabilni sloj novca, a blockchain infrastruktura je dovoljno zrela da se nosi sa skalabilnim aplikacijama. Ovi komadići se ranije nisu uskladili. Internet sada treba novi oblik plaćanja, a tradicionalni tokovi nisu bili izgrađeni za autonomne agente ili mikro plaćanja. x402 je uvjerljiv zahvaljujući svom pragmatičnom pristupu. Umjesto da izmišlja plaćanja od nule, proširuje postojeću HTTP infrastrukturu. Umjesto da zahtijeva nove integracije, radi sa standardnim obrascima koje već razumijemo. x402 Sigurnosni i operativni izazovi su stvarni, ali oni su inženjerski problemi s mogućim rješenjima. Posle skoro tri decenije, konačno može učiniti ono za što je dizajniran: učiniti plaćanje za stvari na internetu tako jednostavnim kao što ih traži. HTTP 402 The foundation is set. Now it's time to build. hvala Erik Reppel, Roni Kaspers Kevin Leffew je, Danny Organ, i sav tim na Korišćenje za otvoreno izvlačenje ovog protokola. Erik Reppel Roni Kaspers Kejt Leffew Danij Orban Korišćenje . hvala Erik Reppel i Juga Kohler Za reviziju Moj doprinos to x402 Erik Reppel Juga Kohler Moj doprinos resursi i dalje čitanje HTTP 402 zahtijeva plaćanje - RFC 2068 - Original 1997 HTTP specifikacija x402 Specifikacija protokola - Službena dokumentacija protokola x402 GitHub Repository - Coinbase's open source implementacija x402 Java implementacija - PR koji je uveo implementaciju Java protokola EIP-712: Ethereum Tipped Structured Data Hashing and Signing - Standard potpisivanja koji se koristi u x402 Osnovna mrežna dokumentacija - Layer 2 blockchain platforma koja se koristi u primerima USDC dokumentacija - USD Coin stablecoin detalji ugovora Spring Boot Filter Dokumentation - Java middleware implementacija Java HTTP Client API - upravljanje HTTP-om sa strane klijenta Standardi za komunikaciju mašina-mašina (M2M) - autonomna komunikacija sistema Autonomous AI Agent Architectures - Istraživanje o modelima dizajna AI agenata Googleov pristup sigurnosti AI agenata - Googleovi prijedlozi za bezbedan, ljudski vođen AI agent okvir