; Forward direction — artdag job as a feed "post object" (per the host loop). ; A job projects to a content-addressed, self-verifying object suitable as a feed ; activity :object; a peer decodes, verifies and runs it to the same result. (define po-runner (artdag/op-table-runner {:blur (fn (params inputs) (+ (first inputs) (get params :radius))) :src (fn (params inputs) 0) :over (fn (params inputs) (+ (nth inputs 0) (nth inputs 1)))})) (define po-job (artdag/build (list (list "s" "src" (list) {}) (list "b" "blur" (list "s") {:radius 2}) (list "c" "blur" (list "s") {:radius 3}) (list "out" "over" (list "b" "c") {} true)))) (define po-out-id (artdag/dag-id po-job "out")) (define po-post (artdag/job->post-object po-job "out")) (artdag-test "post: is a well-formed post object" (artdag/post-object? po-post) true) (artdag-test "post: type tag is artdag/job" (get po-post :type) "artdag/job") (artdag-test "post: post id is the output node's content-id" (artdag/post-object-id po-post) po-out-id) (artdag-test "post: payload is the whole dag (one record per node)" (len (artdag/post-object-wire po-post)) (artdag/node-count po-job)) (artdag-test "post: verifies (ids intact, output present)" (artdag/post-object-verify po-post) true) ; ---- round-trip: decode reconstructs the job by content-id ---- (define po-job2 (artdag/post-object->job po-post)) (artdag-test "post: decoded job contains the output node by content-id" (artdag/member? po-out-id (keys (artdag/dag-nodes po-job2))) true) (artdag-test "post: decoded job has the same node count" (artdag/node-count po-job2) (artdag/node-count po-job)) ; ---- string transport (feed activity / SXTP body) ---- (define po-str (artdag/job->post-string po-job "out")) (define po-post2 (artdag/post-string->object po-str)) (artdag-test "post: survives string transport (id preserved)" (artdag/post-object-id po-post2) po-out-id) (artdag-test "post: transported post still verifies" (artdag/post-object-verify po-post2) true) ; ---- a peer runs the received post to the same result ---- (define po-local-result (artdag/result-of (artdag/run po-job po-runner (persist/open)) po-out-id)) (define po-peer-result (artdag/post-run po-post2 po-runner (persist/open))) (artdag-test "post: peer runs the received job to the same result" (= po-peer-result po-local-result) true) ; ---- tamper detection: mutate a param under a stale id ---- (define po-tampered (assoc po-post :wire (map (fn (rec) (if (= (nth rec 1) "blur") (list (nth rec 0) (nth rec 1) (nth rec 2) {:radius 99} (nth rec 4)) rec)) (artdag/post-object-wire po-post)))) (artdag-test "post: tampered payload fails verification" (artdag/post-object-verify po-tampered) false) ; ---- an id not produced by the job fails verification ---- (artdag-test "post: post id absent from payload fails verification" (artdag/post-object-verify (assoc po-post :id "node:bogus")) false)